在应用程序执行期间跟踪堆栈大小

时间:2018-09-04 21:22:44

标签: stack powerpc

我正在具有64K堆栈大小限制的嵌入式(PowerPC 32位)系统上运行应用程序。由于堆栈溢出,我偶尔会崩溃。

我还可以为普通的Linux系统(在代码中进行一些细微的更改)构建应用程序,因此可以在开发环境中运行仿真。

我想知道哪种方法是找到超出堆栈大小限制的方法的最佳方法,哪一种是发生这种情况(以便执行一些代码重构)的堆栈框架。

我已经尝试过Callgrind(一种Valgrind工具),但似乎不是正确的工具。

我正在寻找一种工具,而不是更改代码(因为它是一个200K LOC和100个文件的项目)。

该应用程序完全用C ++ 03编写。

1 个答案:

答案 0 :(得分:0)

虽然似乎应该有一个现有的工具,但我会通过编写一个小宏并将其添加到可疑函数的顶部来实现它:

char *__stack_root__;

#define GUARD_SIZE (64 * 1024 - 1024)

#define STACK_ROOT \
    char __stack_frame__; \
    __stack_root__ = &__stack_frame__;

#define STACK_GUARD \
    char __stack_frame__; \
    if (abs(&__stack_frame__ - __stack_root__) > GUARD_SIZE) { \
        printf("stack is about to overflow in %s: at %d bytes\n", __FUNCTION__, abs(&__stack_frame__ - __stack_root__)); \
    }

这里是如何使用它:

#include <stdio.h>
#include <stdlib.h>

void foo(int);

int main(int argc, char** argv) {
    STACK_ROOT;                    // this macro records the top of the bottom of the thread's stack
    foo(10000);
    return 0;
}

void foo(int x) {
    STACK_GUARD;                   // this macro checks if we're approaching the end of memory available for stack
    if (x > 0) {
        foo(x - 1);
    }
}

在此处添加注释:

  • 此代码假定为单线程。如果有多个线程,则需要跟踪单个__stack_frame__变量,每个线程一个。为此使用线程本地存储
  • 使用abs()来确保宏在PowerPC向上和向下扩展时都起作用(它可以:取决于您的设置)
  • 根据自己的喜好调整GUARD_SIZE,但使其小于目标上堆栈的最大大小