calltree看代碼調用圖


calltree是在linux下面看c代碼(尤其是復雜的內核代碼)的神器。

推薦  calltree+vim + ctags + cscope + taglist 【 vim: 搭建vim看代碼的環境   http://www.cnblogs.com/mylinux/p/5013588.html】

  或者 calltree + source insight

source insight能方便地查看向上和向下的函數(變量等)調用關系,並且支持多種語言,幾乎是無可替代的。但調用深度太大的時候,人就記不住了,這個時候calltree可以生成一個全局的調用圖,便於很快掌握代碼框架。

如想看內核代碼start_kernel干了些什么:

#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 graphviz

使用:    
    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

注意:

  調用關系一般比較復雜,最好設置好(1)想要關心的函數(2)調用深度(3)關心的目錄,否則又會引入過多無關選項,干擾視線。

 


免責聲明!

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



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