robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 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: