http://blog.csdn.net/elitemouse/article/details/41680113
http://www.tinylab.org/callgraph-draw-the-calltree-of-c-functions/
http://www.cnblogs.com/louxin/archive/2012/01/02/2310488.html
calltree 已經在博客文件中
[root@server1 ~]# cat test.c
#include <stdio.h>
#include <unistd.h>
void fun1(void)
{
fun2();
}
void fun2(void)
{
fun3();
}
fun3()
{
printf("test1");
}
int main(void)
{
fun1();
return 0;
}
[root@server1 ~]# ./calltree -gb -np -m test.c main [test.c:18]: | fun1 [test.c:6] | | fun2 [test.c:10] | | | fun3 [test.c:14] | | | | printf [root@server1 ~]# ./calltree -b -np -m test.c main: | fun1 | | fun2 | | | fun3 | | | | printf
calltree -b -np -m test.c -dot >test.dot
dot -Tjpg test.dot -o calltree.jpg

今天使用了calltree這個源碼函數關系查看工具,結果很直觀,但安裝過程有點點繁瑣,現將其安裝過程記錄下來,免得以后忘了。
當我們查一個比較大的項目的代碼時,往往函數間的關系比較復雜,如果直接看源碼,函數間跳來跳去的,頭都跳暈了,最后還沒看出個所以然來,calltree這個工具滿足了廣大程序員的“消費”需求,可以很清楚的打印出函數間的調用關系,如果要使用圖形化的工具來查看函數調用關系還得裝一個軟件graphviz。好了,下面開始講安裝過程:
從下面這個網站上下載源代碼:calltree-2.3.tar.bz
http://citeseer.ist.psu.edu/graham82gprof.html
1、解壓安裝到系統路徑
#tar jxvf calltree-2.3.tar.bz
#cd calltree-2.3
#make //不用配置,直接編譯
編譯完成后會在當前目錄的calltree/OBJ/i686-linux-cc目錄下會生成一個二進制文件:calltree,這就是我們需要的文件,將其拷貝到/usr/bin目錄下,或者做一個軟鏈接。
2、開始使用calltree
下面進入到我一個示例代碼中,輸入如下命令:
#calltree -gb -np -m *.c
從中可以很容易的看出函數間的調用關系。
下面介紹一下各選項:
-b 就是那個豎線了,很直觀地顯示縮進層次。
-g 打印內部函數的所屬文件名及行號,外部函數所屬文件名和行號也是可打印的,詳man
-np 不要調用c預處理器,這樣打印出的界面不會很雜亂,但也可能會產生錯誤哦,如果我們只看
函數的調用關系的話,不會有大問題。
-m 告訴程序從main開始
還有一個重要的選項是 listfunction ,縮寫是lf,用來只打印某個函數中的調用,用法是:
#calltree -gb -np lf=send_query *.c
從這個結果可以非常方便的看出函數調用關系,不過還是不夠美觀哦,所以加上-dot參數,產生一個dot圖形吧。
不過在使用dot命令之前,需要安裝一個graphviz軟件包,我在cent-os5.5是直接輸入以下命令安裝的:
#yum install graphviz*
如果你的系統不支持yum在線安裝,可以去下面這個網站下載相應的rpm包。
http://www.graphviz.org/
下面是我寫的一個腳本(可以分開每一條命令來執行)test.sh:
#!/bin/sh
/usr/bin/calltree -gb -np -m *.c -dot > test.dot
/usr/bin/dot -Tjpg test.dot -o calltree.jpg
運行腳本:
#sh +x test.sh