利用GDB生成C程序的函数调用图

利用gdb,在关心的函数上设置断点,然后打印调用堆栈,然后分析gdb的logfile,得出函数调用关系,再利用dot可以生成函数调用图。

之所以这样做,是因为全部函数的调用关系太复杂,太大,分文件来做函数调用图是一个可行的事情。

用perl写了一个工具,可以列出给定obj中的函数调用图,最终生成一个jpg文件。代码在这里将文件的.txt去掉,就是直接可以使用的pl文件了。另外关于dot的文档在这里.

下面是一个例子:

c 代码

#include <stack>
#include <stdio.h>

using namespace std;
int arr[] = {1 , 2 , 3, 4, 9 , 5 , 7 } ;
int size=sizeof(arr)/sizeof(int) ;

int stack_test()
{
stack<int>  myInt;
for(int i = 0 ; i < size ; i ++ )
{
myInt.push(arr[i]);
}

while(myInt.size() > 0){
printf(“%d\n”,myInt.top()) ;
myInt.pop();
}
}
void stack_test2()
{
return ;
}
int main(int argc, char** argv)
{

stack_test();
stack_test2();
return 0 ;
}

编译方法: g++  -g -c stack.cpp -o stack.o
g++ -g stack.cpp -o stack

另外: option_file的内容为

r

生成函数调用图的命令行为:

./genCallInfo.pl -obj ./stack.o -bin ./stack -option_file ./options_file

生成的调用图为:

stack

注意,这里的示例为演示用,实际上,文件要比这个大得多。因此实际使用时, obj文件通常只是bin文件的一小部分,而不是像这个例子这样。通常的命令行为:

./genCallInfo.pl  -obj  ./stack.o  -bin ./bigprojBinary -option_file ./options_file



本文地址: http://www.bagualu.net/wordpress/archives/3270 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注