1.2 函数调用关系图 calltree
calltree可以非常简单方便地反应一个项目的函数调用关系图,虽然诸如gprof这样的工具也能做到,不过如果仅仅要得到函数调用图,calltree应该是更好的选择。如果要产生图形化的输出可以使用它的-dot参数也可以参考资料[12]。从这里可以下载到它,ftp://ftp.berlios.de/pub/calltree/calltree-2.3.tar.bz2
关于calltree的实现原理,可以参考资料[13],关于它的详细用法请参考资料[14]或者它的-h参数获取帮助。
这里是一份演示结果,
$ calltree -b -np -m *.c
main:
| close
| commitchanges
| | err
| | | fprintf
| | ferr
| | ftruncate
| | lseek
| | write
| ferr
| getmemorysize
| modifyheaders
| open
| printf
| readelfheader
| | err
| | | fprintf
| | ferr
...
这样一份结果对于“反向工程”应该会很有帮助,它能够呈现一个程序的大体结构,对于阅读和分析源代码来说是一个非常好的选择。虽然cscope和ctags 也能够提供一个函数调用的“即时”(在编辑vim的过程中进行调用)视图(view),但是calltree却给了我们一个宏观的视图。
不过这样一个视图只涉及到用户空间的函数,如果想进一步给出内核空间的宏观视图,那么strace和KFT就可以发挥它们的作用。关于这两个工具请参考条目[11]列出的相关资料。另外,该视图也没有给出库中的函数,如果要跟踪呢?需要ltrace工具。