我正在具有64K堆栈大小限制的嵌入式(PowerPC 32位)系统上运行应用程序。由于堆栈溢出,我偶尔会崩溃。
我还可以为普通的Linux系统(在代码中进行一些细微的更改)构建应用程序,因此可以在开发环境中运行仿真。
我想知道哪种方法是找到超出堆栈大小限制的方法的最佳方法,哪一种是发生这种情况(以便执行一些代码重构)的堆栈框架。
我已经尝试过Callgrind(一种Valgrind工具),但似乎不是正确的工具。
我正在寻找一种工具,而不是更改代码(因为它是一个200K LOC和100个文件的项目)。
该应用程序完全用C ++ 03编写。
答案 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向上和向下扩展时都起作用(它可以:取决于您的设置)