代码解析技术(二)
By青木峰郎 translated by 东北藏
■动态解析工具
动态解析就是解析时使用调试器或对象监视器等。实际上代码是怎样的通路,怎样的数据构造等观测运行的程序的结果远比头脑的思考来的更快。可以使用以下的几款综合工具。
· gdb
除此,使用printf来调试是比较原始的动态解析方法。
使用DDD (data display debugger)可以将数据结构变成图的形式。DDD通常作为各种调试器的UI,提供GUI的同时可以将很多东西可视化。比如http://www.gnu.org/software/ddd/all.jpg将链表可视化。
· http://www.gnu.org/software/ddd/
一般,以文本的形式写出的话使用后述的graphviz来图形化为好。
针对函数的调用记录(Programm Trace)用ctrace这样的工具。Linux里有ltrace,笔者没有确定,Solaris里好像有同样的工具sotrace,可以记录共有库函数的调用。
特别是如果仅限于系统调用,有strace, ktrace, truss。Linux的是strace,BSD的是ktrace,Solaris的是truss。
ctrace
http://www.vicente.org/ctrace/
ltrace
http://packages.debian.org/unstable/utils/ltrace.html
strace
http://www.liacs.nl/~wichert/strace/
ktrace (OS 附)
truss (OS 附)
而且,据说Trace不仅仅只输出为文本的形式,也可以可视化。详细情况以下这本书中有记载。
"Programming Languages" Ravi Sethi, Tom Stone; Addison-Wesley Pub Co; ISBN: 0201590654; 2nd edition (February 1996)
邦译:『编成语言的概念和构造』新装版、Ravi Sethi / Tom Stone、PearsonEducation、2002
这个说法的记载是在p145 4.4“驱动具有变为箱子的持续时间(?)”的前后。“驱动树”这个名字是在动态调用图的话题中引入的。“驱动树”好像是activation tree的翻译。
■静态解析工具
使用后感觉global是最通用的。与独自的形式相比,以HTML为输出用Web浏览器浏览是最方便不过的了。
gonzui
http://gonzui.sourceforge.net/
对应多种语言的代码搜索引擎。可以进行文件内的增量式检索及浏览代码。
global
http://www.gnu.org/software/global/
C语言用。具有相互关联及函数的定义等的检索等高性能。与htags一起使用可以输出HTML。不足的地方:不能显示全局变量及函数指针的定义。并且在使用htags生成HTML时虽然在Tag内可以增加属性值,直接输出Tag而不能用CSS来指定。我使用的是经过改造的。只是改变一下定义的全局字符串常量即可。(但是,要决定CSS名)
可以包括在宏中定义的函数或全局变量,虽然不错,但一旦这样做就像C编译器一样需要解析。
cscope
http://cscope.sourceforge.net/
用于C/C++/Java。基于Curses的代码浏览器。因为使用独自的命令而使用起来很不方便。没怎么使用过,但功能很多。很多人认为cscope比global毫不逊色。
ctags
基本上用于C语言。可以生成vi的Tag文件。Tag文件就是可以记录函数或变量的位置并进行一系列跳转的日志。就像Emacs中使用的etags一样。
lxr
读Linux代码而开发的辅助工具。名字由Linux Cross Referencer而来。作为形式为CGI。因为比较喜欢独立工具,没怎么使用过这款。听说很方便使用。
doxygen
http://www.stack.nl/~dimitri/doxygen/
文档生成工具。注释可以写到文档里也可抽取出来,可以以多种格式输出。可以将代码以HTML等格式输出,功能很强大。但是代码HTML化时设定略显复杂。
cxref
http://www.gedanken.demon.co.uk/cxref/
C cross referencing & Documentation tool、即交叉参照,文档生成工具。若不添加注释就不能生成文档。基本上是一款文档生成工具,交叉参照只是附带功能。如果用于代码阅读可以使用任意一种功能。
cflow
http://wh58-508.st.uni-magdeburg.de/sparemint/html/packages/cflow.html
以前是UNIX附带的工具。可以把C语言函数的调用关系文档化。现在看来虽然不是特别方便,但很简单,也可输出到管道,也较实用。
另外告诉大家一个Fortran用的静态解析工具,以下是它的连接。
http://www.fortranlib.com/freesoft.htm#Static Analysis Tools
■杂谈:关于调用关系的可视化
调用关系可视化的工具比较少,简单介绍一下当前情况。
SXT
单元内的函数的关系视觉化。对应语言为C、dBASE、Fortran、Java、Lisp。是笔者最想找的工具。
VCG
http://rw4.cs.uni-sb.de/users/sander/html/gsvcg1.html
输入简单的记述语言后可以将其可视化。最近的cflow或bison可以直接生成面向VCG的语言。可以实现函数,结构体,规则的关系的全自动化。
graphviz
http://www.research.att.com/sw/tools/graphviz/
输入dot形式的图形表示语言的信息,可以输出各种形式的图形。。(PostScript, png, jpeg等等)
下图是它的一个测试例子。Ruby解释器的中心。
本文的以前版本对调用关系可视化的内容的记述偏多。调用关系的视觉化很容易理解代码一系列的动作,但未必就一定管用。函数数目多,调用深度较深的时候可视化更能发挥它的作用。否则,也没有太多的必要。
译者注:
1.由于水平有限且时间仓促翻译错误在所难免,遇到读不懂之处敬请联系。
2.这里的静态解析与动态解析与基于编成规约的对代码的静态分析及对程序运行时的内存使用状况分析等的动态分析有概念,目的等的差别。这里侧重阅读与理解代码。
3.这里介绍的方法有可借鉴之处,即思想部分,对其中的一些工具,因为使用起来可能造成大家时间上的浪费,尤其是一些工具比较老,不一定很有价值。再者,这方面的工具种类繁多,理解了文章的思想足矣。
望这篇译文能对大家有所启发和帮助。