calltree查看工程代碼中的函數調用關系


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM