CodeViz是《 Understanding The Linux Virtual Memory Manager 》( at Amazon , 下載地址 在頁尾)的作者 Mel Gorman 寫的一款分析C/C++原始碼中函數調用關係的open source工具(類似的open source軟體有 egypt 、 ncc )。 其基本原理是給 GCC 打個補丁,讓它在編譯時間每個源檔案時 dump 出其中函數的 call graph,然後用 Perl 指令碼收集並整理調用關係,轉交給Graphviz繪製圖形。
安裝前提:經筆者多次測試,發現在64位linux安裝失敗,在32位rhel 6.5下面安裝成功
一、下載安裝包 1、 codeviz-1.0.12 http://www.csn.ul.ie/ ~mel/projects/codeviz/ 2、 graphviz-2.38.0 http://www.graphviz.org/Download_source.php 3、gcc-4.6.2 http://ftp.gnu.org/gnu/gcc/gcc-4.6.2/gcc-4.6.2.tar.gz 4、安裝gcc需要的依賴包 4.1 mpc-1.0.3 http://www.multiprecision.org/index.php?prog=mpc&page=download 4.2 mpfr-3.1.4 http://www.mpfr.org/ 4.3 gmp-5.0.1 https://gmplib.org/
二、安裝 1、將下載的安裝包放在/home/shlian/Downloads/目錄,依次解壓:codeviz、graphviz、mpc、mpfr、gmp到目前的目錄
2、安裝gcc依賴包 cd gmp-5.0.1 ./configure --prefix=/usr && make && sudo make install && cd ../mpfr-3.1.4 && ./configure --prefix=/usr && make && sudo make install && cd ../mpc-1.0.3 && ./configure --prefix=/usr && make && sudo make install 執行下面的命令,依次安裝gmp、mpfr和mpc,因為mpc依賴於gmp、mpfr 3、安裝graphviz cd graphviz-2.38.0 ./configure --prefix=/usr && make && sudo make install 4、安裝codeviz cd codeviz-1.0.12 cp ../gcc-4.6.2.tar.gz compilers ./configure --prefix=/usr && make && sudo make install 安裝gcc大約需要一個小時左右,慢慢的讓他安裝吧 …… ……經過耐心的等待,終於安裝完成,然後就可以使用了
安裝完成後,會有如下資訊: Patched gcc is installed to /usr/local/gccgraph. To compile a project
for
use with CodeViz, genearlly the following will work make CC=/usr/local/gccgraph/bin/gcc
or g++ To generate a full.graph file
for C,
use genfull
For C++, make sure you
use the cppdepn method with genfull -g cppdepn
or the results will not be what you expect.
這個gcc預設會被安裝到/usr/gccgraph/bin/目錄,
三、使用流程
1. 使用剛剛安裝的gcc-4.6.2來編譯目前的目錄下所有.c檔案,gcc/g++為編譯的每個 C/C++檔案產生.cdepn 檔案。只要編譯(參數 -c)就行,無需連結。
即為:/usr/gccgraph/bin/gcc test.c -c
2.調用genful會在目前的目錄產生一個full.graph檔案,該指令碼可以產生項目的完整調用圖資訊檔,記錄了所有函數在源碼中的位置和它們之間的調用關係。 因此調用圖資訊檔可能很大很複雜,,預設使用 cdepn 檔案來建立調用圖資訊檔。
即為:genfull -f test.c.cdepn
3. 使用gengraph可以對給定一組函數產生一個小的調用圖 main.ps,顯示函數調用關係。
即為:$ gengraph -f main -g full.graph
在可視化環境,開啟main.ps即可,當然也可以產生其他格式的圖片,詳見後文
四、執行個體示範 1、寫一個簡單的程式: 2、使用剛剛安裝好的gcc編譯:
會產生test.c.cdepn檔案,裡麵包含了產生.graph誶的資訊:
3、產生full.graph檔案 查看一下full.graph檔案的內容: 4、產生圖形檔案: 這個main.ps即可在可視化環境使用graphviz開啟,見效果圖: 這圖很清楚的反應了函數間的調用關係 產生不同類型的圖形檔案: gengraph --output-type "png" -f main #詳見gengraph --man 五、命令參數詳解 1、genfull genfull --man #可查看詳細的參數 2、gengraph gengraph --man #可查看詳細的參數
-f:指定頂級函數,即入口函數,如main等(當然不限定是main了);
-o:指定輸出的postfile檔案名稱,不指定的話就是函數名了,如上面的main;
--output-type:指定輸出類型,例如png、gif、html和ps,預設是ps,如上面的main.ps;
-d:指定最大調用層數;
-s:僅僅顯示指定的函數,而不對其調用進行展開;
-i:忽略指定的函數
-t:忽略Linux特有的核心功能集;
-k:保留由-s忽略的內部細節形成的中間檔案,為sub.graph 六、後記: 1、在安裝完成後,調用gengraph(gengraph -f main -g full.graph)產生ps格式檔案時,會報如下錯誤: Error:<stdin> error: syntax error in line 4 near ';',不知道為什麼,還沒有解決,但是可以產生main.ps,並且main.ps資訊是正確的,見上面的效果圖。 如果使用 gengraph -f main -g full.graph --output-type "png" 則不會報錯…… 2、如果是c++的檔案,使用genfull -g cppdepn test.c.cdepn 產生了full.graph,但是在調用gengraph時,報錯: Error:<stdin> error: syntax error in line 4 near '; Error: <stdin>: syntax error in line 28 near '_Tp' 並且產生不main.ps,
經多次測試發現,報錯與--output-type輸出的格式有關係,有的格式不會報錯,有的會報錯,真心懷疑gengraph存在問題 解決方案還在尋找中…………