我想计算给定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,我不知道这是否适用,因为你可能无法自己编译所有必要的源代码,但这只是我想到的一个东西。