[分享] CallGraphviz – call graph visualzer

看板Linux作者 (Rex Tsai)時間13年前 (2011/03/31 10:08), 編輯推噓5(500)
留言5則, 5人參與, 最新討論串1/1
圖文: 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
推一個, REF 好多阿XD
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
Rex 必推
03/31 13:52, 4F

04/01 09:11, , 5F
好威
04/01 09:11, 5F
文章代碼(AID): #1Da-8xqQ (Linux)