《Linux环境下C编程指南(第二版)》p63页介绍了其他的编译调试工具,其中提到了calls。
该工具的使用比较简单
calls test.c就可以显示该文件中的函数调用树图
示例如下:
test.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*;{}*/
void my_print(char *string);
void my_print2(char *string);
int main()
{
char my_string[] = "hello there";
my_print(my_string);
my_print2(my_string);
}
void my_print(char *string) {
printf("The string is %s\n", string);
}
void my_print2(char *string) {
char *string2;
int size, size2, i;
size = strlen(string);
size2 = size - 1;
string2 = (char*)malloc(size+1);
for (i = 0; i < size; i++) {
string2[size2 - i] = string[i];
}
string[size] = '\0';
printf("The string printed backward is %s\n", string2);
}
注意:代码中
/*;{}*/,需要在调用calls的时候放开注释,否则calls调用无返回,具体原因目前还没找到,可能跟修改calls的源码有关。
接下来讲解calls的安装步骤。
从网上下载的下来calls.tar.Z,解压之后直接编译会报错,需要手动修改部分文件
修改列表:
1,文件main.c 40行
注释掉
/*extern char *sys_errlist[];*/
2,文件main.c 217行
删除多余的)
case 'U':
sprintf(sbTemp, "-%c%s ", cOption, optarg);
3,文件scan.c30行
注释掉
/*static*/ HASH *
然后需要在cygwin中建立/lib/cpp符号链接:
ln -s /etc/alternatives/cpp /lib/cpp
显示效果:
![](https://img-my.csdn.net/uploads/201208/31/1346348627_8521.png)
在完成上述步骤之后,可以编译calls
在cygwin中不能使用make编译calls,会报如下错误:
![](https://img-my.csdn.net/uploads/201208/31/1346347656_2934.png)
需要先手动编译各个文件如下:
gcc -c main.c
gcc -c scan.c
gcc -c getopt.c
gcc main.o scan.o getopt.o -o calls.exe
生成calls.exe
然后执行calls.exe test.c生成上述test.c中的函数调用树。
生成好的calls工具包可以在我的资源中下载。
http://download.csdn.net/detail/vivianke/4538141
参考文章:http://www.cppblog.com/tqsheng/archive/2012/04/05/170209.html