【问题标题】:Any method to get the stack size of all functions in a file or a project in C language?有什么方法可以用 C 语言获取文件或项目中所有函数的堆栈大小?
【发布时间】:2011-10-31 01:39:19
【问题描述】:

我想获取堆栈大小大于分配大小的所有函数,有什么简单的方法可以建议吗?

获取.obj文件,反汇编,然后分析输出文件?

【问题讨论】:

  • 您要解决的问题是什么?
  • IME,如果堆栈大小大于默认大小,编译器通常会报错,不编译代码。
  • 什么是函数的“堆栈大小”?调用时函数在堆栈上可能使用的额外空间量?您是否将函数的调用包括在此计算中,如果是,这是否会使递归函数的堆栈大小无限?
  • 检测堆栈溢出的风险。我想获取堆栈太大的函数,并对其进行重构
  • 您是否可以访问源代码,还是必须分析目标文件?

标签: c stack-overflow stack-size


【解决方案1】:

您可以查看每个函数的程序集转储。在 gcc 中,您使用 -S 选项。

假设您对函数foo 感兴趣。然后,gcc 将函数名修改为_foo。如果您看一下程序集,您应该会在函数顶部附近看到一条移动堆栈指针的指令。例如,在 OSX 中你有类似的东西:

_foo:
    ...
    movq %rsp, %rbp
    ...
    subq $48, %rsp

那个数字,$48,就是堆栈大小。

或者,您可以使用 nm 查找等效命令以查找函数开始的地址,ndisasm 为您提供人类可读的转储,然后扫描堆栈指针的移动位置。

【讨论】:

    【解决方案2】:

    在嵌入式计算之外,无限递归比任何特定调用更可能是堆栈溢出的罪魁祸首。

    话虽如此,首先,寻找本地分配的数组:

    void foo() {
        ...
        char buffer[1024] = "";
        ...
    }
    

    另外,不要忘记 alloca() 调用 - 它在堆栈上动态分配空间,就像 malloc() 在堆上分配空间一样。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2011-12-10
      • 2020-04-11
      相关资源
      最近更新 更多