robot
最新文章(10)
MadButterfly 和 Javascript 合體的威力
Adapt C code for Javascript
OpenVG for Linux/FreeBSD with X
回收 Linux cached memory
公告: 更換 domain name
關於 GCC nested function
GLUT 作為 Embedded System 的 UI 平台
別被 kernel 嚇到了
SVG 加 Gecko 完全攻略
在 OSDC 展示的 Plurk client
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (120)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
雜記 (45)
javascript (36)
Linux (31)
blog (30)
所有關鍵字
新增 URL
srcana 介紹 (台)
by thinker
2 Columns
關鍵字:
雜記
srcana 是,以 GNU global 為基礎的$程式碼分析$工具,$統計$程式模組之間的關聯性。 OSS 的世界裡,除了 $coding$ , programmer 也愛有讀 code 、 追蹤 code 的能力。網路的時代, programmer 用更加多的時間,分析現成的 code ,整合成系統的一部分,並改善工作效率。在讀別郎的 code 的時瞬, programmer 時常有一種無安全的感覺。 programmer 因此受著細節的束綁,無法看著觀察目標的全貌。毋過,也是愛透過觀察各單元之間的關係,全貌才會慢慢浮現。另外一方面,關係是由模組之間的呼叫、引用所組成。也著愛詳細了解模組內容的細節,才有法度了解 module 之間的關係。 srcana 的功能,是透過自動$統計$ module 內部的 function 和其它 module 之間的呼叫數量,了解 module 的使用範圍,和 module 之間的 couple 程度。$統計$的結果,毋免 trace source code , programmer 就會使決定是叨一寡 function 組成 module 的 interface ,而直接對 interface 進行分析。 == 使用 == 開始用 srcana 分析 source code 之前, # 必需先用 GNU global 的 gtags parse soruce code 。 # 然後再使用 srcana 的 funcref.py 產生相關的 $database$ ,作為分析的資料來源。 # 最後使用 srcana 提供的 module ,進行 soruce code 的分析。 === 執行 gtags === 咱以分析 $FreeBSD$ 的 kernel source code 為例。 $FreeBSD$ 的 kernel source code 一般是在 /usr/src/sys 目錄,另外假設咱的工作目錄是 /path/to/work/dir ,執行下面的命令, {{{ cd /usr/src/sys gtags /path/to/work/dir/ }}} parse source ,並將資料庫放佇咱的工作目錄。此時 /path/to/work/dir/ 下面有 {{{ -rw-r--r-- 1 thinker users 1155072 May 17 21:32 GPATH -rw-r--r-- 1 thinker users 31260672 May 17 21:34 GRTAGS -rw-r--r-- 1 thinker users 35225600 May 17 21:36 GSYMS -rw-r--r-- 1 thinker users 26198016 May 17 21:32 GTAGS }}} GNU global 就是使用這寡 $database$ 提供查詢服務。 === 產生 Reference DB === funcref.py 透過 parse global 指令的查詢結果,將 function 之間的呼叫關係 (reference),全部攏記錄佇 $database$ ,作為分析的資料來原。 執行下面的命令,會產生咱所愛的 reference $database$ 。 {{{ GTAGSROOT="/usr/src/sys"; export GTAGSROOT GTAGSDBPATH="/path/to/work/dir"; export GTAGSDBPATH cd /usr/to/work/dir python funcref.py /usr/src/sys/ refin refout refpre }}} refin 、 refout 和 refpre 記錄 function 被叨一寡 function 呼叫,和呼叫叨一寡 function ,最後是 function 所在的檔案、位置。 == 分析 == programmer 通也利用 srcana 提供的 function ,分析 source code 的 reference 關係。譬如說, srcana 有提供 freebsd_vm.py 作為 $FreeBSD$ kernel 的 VM (virtual memory) module 和系統其它部分的關係。 下面指令會分析其它 module 對 vm/vm_map.[ch] 的呼叫情況。 {{{ GTAGSROOT="/usr/src/sys"; export GTAGSROOT GTAGSDBPATH="/path/to/work/dir"; export GTAGSDBPATH cd /usr/to/work/dir python freebsd_vm.py -s vm/vm_kern }}} 分析的結果 {{{ [('kmem_free', 321), ('kmem_alloc', 161), ('kmem_free_wakeup', 2), ('kmem_alloc_wait', 2), ('kmem_init', 1), ('kmem_suballoc', 1), ('kmem_alloc_nofault', 0), ('kmem_malloc', 0)] }}} 第一個欄位是 function ,後面是其它 module 呼叫的數量。如此,咱會使知也啥麼 function 是 interface ,啥麼恰重要。情像 kmem_free 、 kmem_alloc 使用的數量尚多,真可能就是這個 module 提供的主要功能。而 kmem_malloc 使用的數量是 0 ,可能只是 module 內部使用而已 (VM module)。另外 kmem_init 、 kmem_suballoc 只使用一遍,明顯只用在特別的狀況,不是主要的功能。 另外 srcana 也能製作出 linkname:graphviz http://www.graphviz.org/Documentation.php 所使用的 linkname:[dot language] http://www.graphviz.org/doc/info/lang.html 文件,畫出 module 的關係。以 freebsd_vm.py 為例,使用下面的參數,就會使產生關係圖。 {{{ python freebsd_vm.py vm/vm_kern > vm_kern.dot dot -Tps -Gsize="8,8" -Nfontsize=7.0 -o vm_kern.ps vm_kern.dot }}} [attach:vm_kern.png] 位圖中,咱會使看出 vm/vm_kern.[ch] 和其它 module 的關係。舉一個例,只有 kern/kern_malloc.c 有使用著 kmem_suballoc() 這個 function 。當咱要將 VM module 替換掉的時,透過這張圖就會使了解,會影嚮著外多糜件。 == statis == srcana 提供的 statis 這個 module ,提供分析 source code 的主要功能。舉例說, freebsd_vm.py 就使用到 statis.cnt_ref_from_others() 這個 function {{{ funcs = statis.functions_in_subdir('/usr/src/sys', subdir) ref_cnts = statis.cnt_ref_from_others(funcs, clazzer.dbs, clazzer.cat) }}} 佇這段程式當中 * 用 functions_in_subdir() 傳回指定目錄或者檔案內的所有 functions 。 * 再用 cnt_ref_from_others() $統計$ function 被呼叫的數量。 * clazzer.dbs 是一個 statis.ref_dbs 物件 * clazzer.cat 是將 function 分類的 callable statis.cnt_ref_from_others() 透過 clazzer.cat 的分類,$統計$每一分類的呼叫數目。傳回來的資料會像 {{{ [('vm/vm_kern.c/kmem_alloc', {'other': 161, 'mach': 13}), ('vm/vm_kern.c/kmem_free', {'other': 321, 'mach': 18}), ('vm/vm_kern.c/kmem_alloc_wait', {'other': 1, 'kern/kern_exec.c': 1, 'mach': 2}), ('file:vm/vm_kern.c', {}), ('vm/vm_kern.c/kmem_suballoc', {'kern/kern_malloc.c': 1}), ('vm/vm_kern.c/kmem_malloc', {'mach': 1}), ('vm/vm_kern.c/kmem_free_wakeup', {'other': 1, 'kern/kern_exec.c': 1, 'mach': 2}), ('vm/vm_kern.c/kmem_init', {'other': 1}), ('file:vm/vm_kern.h', {}), ('vm/vm_kern.c/kmem_alloc_nofault', {'mach': 13}), ('vm/vm_kern.h/_VM_VM_KERN_H_', {})] }}} 頭前是被呼叫的 function 的分類,這用檔案名加 function name 作為分類。後面是每一個進行呼叫的 function 的分類,和呼叫的$統計$數目。 == 結語 == srcana 所提供的功能並無複雜,但是用佇分析 source code 的初期,可以幫助 programmer 用恰短的時間,掌握 source code 的骨格。希望末來有機會,可以將這個工具,整合入 IDE 工具,幫助更加多人。 == Download == * http://master.branda.to/downloads/srcana/srcana-0.1.tar.gz
最後更新時間: 2007-06-02 22:29:16 CST |
引用
查詢:
COMMENTS: