calltree是在linux下面看c代碼(尤爲是複雜的內核代碼)的神器。php
推薦 calltree+vim + ctags + cscope + taglist 【 vim: 搭建vim看代碼的環境 http://www.cnblogs.com/mylinux/p/5013588.html】html
或者 calltree + source insight
source insight能方便地查看向上和向下的函數(變量等)調用關係,而且支持多種語言,幾乎是無可替代的。但調用深度太大的時候,人就記不住了,這個時候calltree能夠生成一個全局的調用圖,便於很快掌握代碼框架。linux
如想看內核代碼start_kernel幹了些什麼:vim
#calltree -np -b list=start_kernel depth=3 `find ./init/ ./kernel/ -name "*.c"` > maps框架
#vi maps函數
start_kernel: | WARN | acpi_early_init | anon_vma_init | boot_cpu_init | | set_cpu_active | | | cpumask_clear_cpu | | | cpumask_set_cpu | | | to_cpumask | | set_cpu_online | | | cpumask_clear_cpu | | | cpumask_set_cpu | | | to_cpumask | | set_cpu_possible | | | cpumask_clear_cpu | | | cpumask_set_cpu | | | to_cpumask | | set_cpu_present | | | cpumask_clear_cpu | | | cpumask_set_cpu | | | to_cpumask | | smp_processor_id | boot_init_stack_canary | buffer_init | build_all_zonelists | calibrate_delay | | calibrate_delay_converge | | | __delay | | calibrate_delay_direct | | | printk | | | read_current_timer | | | time_before_eq | | calibrate_delay_is_known
下載:
calltree-2.3.tar.bz2 http://download.chinaunix.net/download.php?id=2245&ResourceID=1172
sudo apt-get install graphvizui
使用:
calltree -help
calltree -np -gb -m *.c
calltree -np -gb lf=send_query *.c
calltree -np -b list=start_kernel depth=4 `find ./init/ -name "*.c"` > maps
calltree -np -b list=raw_spin_lock_irqsave `find . -name "*.c"`
calltree -np -gb lf=raw_spin_lock_irqsave `find . -name "*.c"`
還能夠生成一個調用圖,以kernel爲例
calltree -np -b -dot list=start_kernel ./init/*.c > ~/start_kernel.dot
dot -T png start_kernel.dot -o ./testhaha.png
下面介紹一下各選項:
-b 就是那個豎線了,很直觀地顯示縮進層次。
-g 打印內部函數的所屬文件名及行號,外部函數所屬文件名和行號也是可打印的,詳man
-np 不要調用c預處理器,這樣打印出的界面不會很雜亂,但也可能會產生錯誤哦,若是咱們只看函數的調用關係的話,不會有大問題。
-m 告訴程序從main開始
還有一個重要的選項是listfunction ,縮寫是lf,用來只打印某個函數中的調用,用法是: lf=your_function
depth=#選項: 例如: calltree -gb -np -m bind9/bin/named/*.[c.h] depth=2 > codecalltree.txt
spa
注意:.net
調用關係通常比較複雜,最好設置好(1)想要關心的函數(2)調用深度(3)關心的目錄,不然又會引入過多無關選項,干擾視線。unix