我想获取堆栈大小大于分配大小的所有函数,有什么简单的方法可以建议吗?
获取.obj文件,反汇编,然后分析输出文件?
在嵌入式计算之外,无限递归比任何特定调用更可能是堆栈溢出的罪魁祸首。
话虽如此,在第一个近似值中,寻找本地分配的数组:
void foo() {
...
char buffer[1024] = "";
...
}
另外,不要忘记alloca()
call - 它在堆栈上动态分配空间,就像在堆上分配空间一样malloc()
。
您可以查看每个函数的程序集转储。在 gcc 中,您使用该-S
选项。
假设您对函数感兴趣foo
。然后,gcc 将函数名修改为_foo
. 如果您看一下程序集,您应该会在函数顶部附近看到一条移动堆栈指针的指令。例如,在 OSX 中你有类似的东西:
_foo:
...
movq %rsp, %rbp
...
subq $48, %rsp
这个数字 ,$48
是堆栈大小。
或者,您可以查找等效命令nm
用于查找函数开始的地址,ndisasm
为您提供人类可读的转储,然后扫描堆栈指针的移动位置。