如何使用c代码计算调用图形函数的堆栈大小



我想计算给定callgraph函数的堆栈大小。

for example:假设我有一个函数调用另一个函数,这个函数再次调用其他函数,像这样。

对于上面的例子,如何使用GCC或MINGW或google框架计算堆栈大小。

我需要每个函数或线程的堆栈大小。

请帮我一下。提前感谢。

就像前面提到的,没有标准的方法来确定程序的堆栈大小。但是,您可以在给定的平台上计算特定程序所需的堆栈大小。

对于这种情况,您可以跟踪任何函数中局部变量的最低堆栈地址。然后从main()函数中最后一个局部变量的地址中减去这个,就得到了最大的堆栈大小(比如:表达式求值所需的临时堆栈变量为100字节)。

下面的程序说明了这一点:
#include <stdio.h>
void * lowestStackAddress = ( void * ) 0xFFFFFFFF;
int myFunc( int n )
{
  int m;
  /**** remember lowest stack address ****/
  if ( &m < lowestStackAddress )
    lowestStackAddress = &m;
  /**** do some arbitrary recursive algorithm the compiler can't optimize away ****/
  if ( n == 1 )
    return 1;
  if ( n % 2 == 1 )
    m = n * 3 + 1;
  else
    m = n / 2;
  return myFunc( m );
}
int main ( int argc, char * argv[] )
{
  int n;
  void * mainStackAddress = ( void * ) &mainStackAddress;
  printf( "mainStackAddress=%pn", mainStackAddress );
  n = myFunc( 5 );
  printf( "Largest stack size: %dn", 
    ( char * ) mainStackAddress - ( char * ) lowestStackAddress );
  getchar();
  return 0;
}

你需要把lowestStackAddress的检查/赋值放在每个不调用其他函数的函数中。

非常丑陋的hack,我不知道这是否适用,因为你可能无法自己编译所有必要的源代码,但这只是我想到的一个东西。

最新更新