当前位置:  开发笔记 > 编程语言 > 正文

在编译时检查堆栈使用情况

如何解决《在编译时检查堆栈使用情况》经验,为你挑选了2个好方法。

有没有办法在C编译时知道并输出函数所需的堆栈大小?这是我想知道的:

我们来看一些功能:

void foo(int a) {
    char c[5];
    char * s;
    //do something
    return;
}

在编译这个函数时,我想知道它被调用时会消耗多少堆栈空间.这可能对检测隐藏大缓冲区的结构的堆栈声明很有用.

我正在寻找能打印出类似内容的东西:

file foo.c:function foo stack usage是nbytes

有没有办法不看生成的程序集知道?或者可以为编译器设置限制?

更新:我不是试图避免给定进程的运行时堆栈溢出,我正在寻找一种在运行时之前查找的方法,如果编译器确定的函数堆栈使用可用作编译过程的输出.

让我们换一种说法:是否可以知道函数本地所有对象的大小?我猜编译器优化不会成为我的朋友,因为某些变量会消失但是上限很好.



1> Blaisorblade..:

Linux内核代码在x86上的4K堆栈上运行.因此他们关心.他们用来检查它的是他们编写的perl脚本,你可以在最近的内核tarball中找到script/checkstack.pl(2.6.25已经得到它).它运行在objdump的输出上,使用文档在初始注释中.

我想我很久以前就已经将它用于用户空间二进制文件了,如果你知道一些perl编程,如果它被破坏了很容易解决.

无论如何,它基本上做的是自动查看GCC的输出.内核黑客编写这样一个工具的事实意味着没有静态的方法来使用GCC(或者可能是最近添加的,但我对此表示怀疑).

顺便说一下,使用来自mingw项目和ActivePerl的objdump,或者使用Cygwin,你也应该能够在Windows上以及使用其他编译器获得的二进制文件上执行此操作.


更新:Michael Greene在下面指出GCC 4.6的-fstack-usage可用于C:gcc.gnu.org/gcc-4.6/changes.html; -fstack-usage在下面的shodanex的答案中描述:http://stackoverflow.com/a/126490/53974.

2> shodanex..:

StackAnlyser似乎在检查可执行代码本身以及一些调试信息.这个回复描述了什么是我正在寻找的东西,堆栈分析器看起来对我来说太过分了.

与ADA相似的东西会很好.从gnat手册看这个手册页:

22.2静态堆栈使用分析

使用-fstack-usage编译的单元将生成一个额外的文件,该文件指定基于每个函数的最大堆栈使用量.该文件与具有.su扩展名的目标对象文件具有相同的基本名称.该文件的每一行由三个字段组成:

* The name of the function.
* A number of bytes.
* One or more qualifiers: static, dynamic, bounded. 

第二个字段对应于功能框架的已知部分的大小.

限定符static意味着函数框架大小是纯静态的.它通常意味着所有局部变量都具有静态大小.在这种情况下,第二个字段是功能堆栈利用率的可靠度量.

限定符动态意味着函数框架大小不是静态的.它主要发生在某些局部变量具有动态大小时.当此限定符单独出现时,第二个字段不是功能堆栈分析的可靠度量.当它有界限限定时,意味着第二个字段是功能堆栈利用率的可靠最大值.


这是一个老问题,但是fwiw GCC 4.6的-fstack-usage可用于C:http://gcc.gnu.org/gcc-4.6/changes.html
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有