作者rextsai (Rex Tsai)
看板LinuxDev
标题[心得] CallGraphviz – call graph visualzer
时间Thu Mar 31 13:35:29 2011
原文网址:
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]
使用方法
? python visualizer.py
? 按下 “New”, 选择要分析 C/C++ 专案目录。
? 於 “Search symbol” 键入要追踪的函式名称。
? 每次键入新名称,他会自动对应图中已输入函式是否? caller or callee,并自动画
图。
[52]CallGraphviz 可以将绘图结果存成 dot 格式档案,然後再利用 [53]dot 指令转换格
式。不过它只是把曾经查过的名称记录起来,开启时重新查 cscope 而已,若图大时,每
次开启可能会十分缓慢。
原始码可於 github 下载,授权采用 GNU Lesser General Public License.
? [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
※ 编辑: rextsai 来自: 112.104.53.166 (03/31 14:42)