[分享] CallGraphviz – call graph visualzer
圖文: http://bit.ly/etmDwY
[2]CallGraphviz – call graph visualzer based on csope, graphviz and xdot
= 開源工具現狀 =
許多開發者都有從中介入中大型專案的經驗,常必須試圖理解原始程式的設計,或多或少
都有在程式碼迷宮中找路的經驗。有些專案,程式碼結構嚴謹,軟體設計應用 [3]Design
Patterns. 見名稱、參數即可推斷程式結構,閱讀如沐春風。
但若碰到未經重構的成年老專案,程式邏輯因為年久失修,塞滿各個開發階段的臨時解決
方案,常常已經複雜到難以一眼望穿理解。若是像記憶力虛弱如我,常常追了後面幾千行
、跳了三個檔,就忘了前面幾個檔案的函式名稱。於是常常輔助紙本畫流程圖,但是手繪
圖往往不敵跳來繞去的程式碼邏輯。還是得靠[4]程式碼解析視覺化工具來協助理解。
繪製[5] Call Graph 的工具非常多,一般可以分作 [6]Dynamic analysis 與 [7]Static
analysis 兩種做法。在臺灣,最知名的商業版本工具,大概是 [8]Source Insight。不過
我不用 Windows,對於缺乏原始碼的開發工具興趣也不非常大。
開源的 Dynamic analysis 有像是 [9]Jserv [10]介紹過的 [11]CodeViz 或是 [12]ncc。
不過這類工具需要 patch gcc,不特別適合嵌入式系統專案。因?原始碼常常只支援特定
平臺,或是無法取得編譯工具原始碼,此外不同版本的 compiler 偶爾會造成不同的問題
,造成使用上的困難。
一種比較乾淨的做法是利用像 [13]KCachegrind 利用 [14]valgrind 來收集資料,或
[15]Gprof2Dot 利用 [16]gprof 的輸出資料。再者是利用 gcc 的[17]除錯功能,把
internal representation (RTL) 倒出來,再用[18]egypt 或 [19]Python-RTL 來判讀或
繪圖。
至於 [20]Static analysis 有[21]Fred Chien [22]介紹過的 [23]cflow 或是 [24]
Doxygen 也有類似的[25]繪圖功能。也有工具是配合 [26]cscope 或 [27]global,例如有
人幫 CScope 刻過[28]圖形界面,Vim 有個 [29]CCTree 可用。
= CallGraphviz =
以上這些工具各有優缺點。
最常見的問題是許多工具無法處理 [30]function pointer / [31]dynamic dispatch,最
終還是要人力介入。另外一個使用上的困擾是,這些程式會一口氣畫出整個程式碼的結構
圖。
太多資訊其實妨礙理解,因?用途常常只是追一個臭蟲,程式開發者只想畫出特定路徑來
釐清問題。而context-sensitive 的 call graph 測試工具又耗費資源。
若用 [32]CodeLite, [33]Code Blocks , [34]Eclipse CDT 等開發工具,工具已經內建或
整合 [35]cscope /[36]global,提供 symbol lookup 功能,於是開發者很容易用滑鼠查
閱函式定義或實做,或也可以搭配 [37]LXR 來瀏覽程式碼。已經不需要像是 [38]
cbrowser 專屬的程式碼瀏覽工具[39]。
所以需要的是可以手動的將目前程式情境視覺化的工具,網路上已經有其他開發者做了
[40]Bash: C Call Trees and Graphs 或是 [41]Global-calltree。或是像 [42]ypwang
的[43]方法,記錄函式進出點,再手動繪圖。
這些工具大多是整合 shell scripts,操作上有點不便。另外我也不喜歡 Call Tree 的圖
式,因?樹狀圖無法表現遞迴或交互關係。
於是查找一下,決定拿 [44]cscope 加上 [45]Graphviz 的 [46]DOT 語法來用,改了一個
[47]CallGraphviz。它的功能是一個 Graphviz 前端,後端還是使用 cscope 查 symbols
,為了可以即時瀏覽就拿了 [48]xdot 當作界面。[49]xdot 是以 [50]PyGtk 開發,非常
容易更改,不到三百行就加入我需要的功能。
[51][screenshotcodevisualize-300x179]
使用方法
o python visualizer.py
o 按下 “New”, 選擇要分析 C/C++ 專案目錄。
o 於 “Search symbol” 鍵入要追蹤的函式名稱。
o 每次鍵入新名稱,他會自動對應圖中已輸入函式是否? caller or callee,並自動畫
圖。
[52]CallGraphviz 可以將繪圖結果存成 dot 格式檔案,然後再利用 [53]dot 指令轉換格
式。不過它只是把曾經查過的名稱記錄起來,開啟時重新查 cscope 而已,若圖大時,每
次開啟可能會十分緩慢。
原始碼可於 github 下載,授權採用 GNU Lesser General Public License.
o [54]https://github.com/chihchun/callgraphviz
延伸閱讀
[55] Python Call Graph
References:
[1] http://people.debian.org.tw/~chihchun
[2] http://people.debian.org.tw/~chihchun/2011/03/30/callgraphviz/
[3] http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29
[4] http://en.wikipedia.org/wiki/Program_analysis
[5] http://en.wikipedia.org/wiki/Call_graph
[6] http://en.wikipedia.org/wiki/Dynamic_program_analysis
[7] http://en.wikipedia.org/wiki/Static_program_analysis
[8] http://www.sourceinsight.com/
[9] http://blog.linux.org.tw/~jserv/
[10] http://blog.linux.org.tw/~jserv/archives/001723.html
[11] http://www.skynet.ie/~mel/projects/codeviz/
[12] http://students.ceid.upatras.gr/~sxanth/ncc/
[13] http://kcachegrind.sourceforge.net/
[14] http://valgrind.org/
[15] http://code.google.com/p/jrfonseca/wiki/Gprof2Dot
[16] http://sourceware.org/binutils/docs/gprof/
[17] http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html
[18] http://www.gson.org/egypt/
[19] http://rtlcheck.sourceforge.net/using.html
[20] http://en.wikipedia.org/wiki/Static_program_analysis
[21] http://fred-zone.blogspot.com/
[22] http://fred-zone.blogspot.com/2009/09/trace-cflow.html
[23] http://www.gnu.org/software/cflow/
[24] http://www.stack.nl/~dimitri/doxygen/
[25] http://www.stack.nl/~dimitri/doxygen/diagrams.html
[26] http://cscope.sourceforge.net/
[27] http://www.gnu.org/software/global/
[28] http://en.wikipedia.org/wiki/Cscope#GUI
[29] http://www.vim.org/scripts/script.php?script_id=2368
[30] http://en.wikipedia.org/wiki/Function_pointer
[31] http://en.wikipedia.org/wiki/Dynamic_dispatch
[32] http://codelite.org/
[33] http://www.codeblocks.org/
[34] http://www.eclipse.org/cdt/
[35] http://cscope.sourceforge.net/
[36] http://www.gnu.org/software/global/
[37] http://lxr.linux.no/+trees
[38] http://www.ziplink.net/~felaco/cbrowser/
[39] http://www.ziplink.net/~felaco/cbrowser/
[40] http://toolchainguru.blogspot.com/2008/07/bash-c-call-trees-and-graphs.html
[41] http://stackoverflow.com/questions/2027508/simple-tool-for-callgraph-in-c
[42] http://www.ypwang.info/
[43] http://www.ypwang.info/2010/10/call-graph.html
[44] http://cscope.sourceforge.net/
[45] http://www.graphviz.org/
[46] http://www.graphviz.org/content/dot-language
[47] https://github.com/chihchun/callgraphviz
[48] http://code.google.com/p/jrfonseca/wiki/XDot
[49] http://code.google.com/p/jrfonseca/wiki/XDot
[50] http://www.pygtk.org/docs/pygtk/index.html
[51] http://img714.imageshack.us/i/screenshotcodevisualize.png/
[52] https://github.com/chihchun/callgraphviz
[53] http://www.graphviz.org/cgi-bin/man?dot
[54] https://github.com/chihchun/callgraphviz
[55] http://pycallgraph.slowchop.com/
--
http://people.debian.org.tw/~chihchun/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 112.104.53.166
推
03/31 10:47, , 1F
03/31 10:47, 1F
推
03/31 10:57, , 2F
03/31 10:57, 2F
推
03/31 11:39, , 3F
03/31 11:39, 3F
推
03/31 13:52, , 4F
03/31 13:52, 4F
推
04/01 09:11, , 5F
04/01 09:11, 5F