calltree看代碼調用圖

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

相關文章
相關標籤/搜索