1. 安裝 GraphViz
用新立得軟體管理器
2. 安裝CodeViz
tar zxvf codeviz-1.0.11.tar.gz
2.1安裝帶patch的gcc:
下載gcc-3.4.6.tar.gz
mv gcc-3.4.6.tar.gz codeviz-1.0.11/compilers
cd codeviz-1.0.11/compilers
sudo ./install_gcc-3.4.6.sh /usr/local/gcc-graph
2.2 安裝 CodeViz
./configure --gccgraph=/usr/local/gcc-graph
make install-codeviz
3. 使用
#include <stdio.h>
void test(void);
int
main(void)
{
test();
return 0;
}
void test()
{
return;
}
$/usr/local/gcc-graph/bin/gcc test.c
$genfull test.c.cdepn
$gengraph –output-type “png” -f main
skill:
--output-type,指定輸出類型,例如png、gif、html和ps,預設為ps。
解決函數名字衝突:分析哪些目錄
使用genfull的-s選項,-s指定了檢測哪些子目錄。例如kernel中在
mm目錄和drivers/char/drm目錄下都定義了alloc_pages函數,那麼可以以下列方式調用
genfull:
genfull -s "mm include/linux drivers/block arch/i386"
使用 Daemon/Client 模式:
當full.graph很大時,大量的時間花費到讀取輸入檔案上了,例如kernel的
full.graph是很大的,前面產生的大約有15M,這還不是全部核心的函數調用分析資訊。
為了節省時間,可以將gengraph以daemon方式運行,這要使用-p選項:
gengraph -p -g linux-2.6.25/full.graph
該命令返回時gengraph以daemon方式運行,同時在/tmp目錄下產生了codeviz.pipe檔案。
要產生函數調用圖,可以使用-q選項:
gengraph -q -t -d 2 -f alloc_pages
要終止gengraph的運行,使用如下命令:
echo QUIT > /tmp/codeviz.pipe
一個例子:
現在我們來看如何產生核心的函數調用圖,以2.6.25中alloc_pages函數為例。
首先是編譯核心,這裡我們的目的是查看函數調用關係,並非安裝新核心,所以直接
進行配置編譯:
make menuconfig
make CC=/usr/local/gcc-graph/bin/gcc bzImage
make CC=/usr/local/gcc-graph/bin/gcc modules
產生調用圖:
genfull -s "mm include/linux drivers/block arch/i386 fs init lib kernel net ipc"
這裡使用了-s選項,雖然仍然會產生衝突,但是對於kernel的基本部分來說多數還是沒
有衝突的。這裡的選擇也是為了自己將來分析kernel用,你可以根據自己的需要來產生
full.graph。
產生了full.graph後調用gengraph產生alloc_pages的函數調用圖,這裡我們先直
接使用專案網站上使用的命令,然後再進行解釋:
gengraph -f alloc_pages -d 5
-t -s "buffered_rmqueue out_of_memory try_to_free_pages numa_node_id"
-i "cpuset_zone_allowed"
--output-font "Arial" –output-type "png"
選項:
-d 指定最大調用層數
-s 僅僅顯示指定函數,而不對其調用進行展開
-i 忽略指定函數
gengraph -f alloc_pages -d 3 -t --output-font="Arial" --output-type="png"