By Falcon of TinyLab.org
2015/04/03
最初发表:泰晓科技 – 聚焦嵌入式 Linux,追本溯源,见微知著!
原文链接:源码分析:静态分析 C 程序函数调用关系
评论说明:为更好地聚合大家的讨论,请到上面原文的评论区回复。
故事缘由
源码分析是程序员离不开的话题。无论是研究开源项目,还是平时做各类移植、开发,都避免不了对源码的深入解读。
工欲善其事,必先利其器。今天我们来玩转一个小工具,叫 Callgraph,它可以把 C 语言的函数调用树(或者说流程图)画出来。
传统的命令行工具 Cscope, Ctags 可以结合 vim 等工具提供高效快捷的跳转,但是无法清晰的展示函数内部的逻辑关系。
至于图形化的IDE,如 QtCreator, Source Insight, Eclipse, Android Studio 等,却显得笨重,而且不一定支持导出调用关系图。
在开源软件在线代码交叉检索一文中我们也介绍到了诸如 LXR, OpenGrok 之类的工具,它们避免了本地代码库而且提供了方便的 Web 展示,不过也无法提供函数关系的清晰展示。
下面开始 Callgraph 之旅。
安装 Callgraph
Callgraph 实际由三个工具组合而成。
- 一个是用于生成 C 函数调用树的 cflow 或者 calltree,下文主要介绍 cflow。
- 一个处理 dot 文本图形语言的工具,由 graphviz 提升。建议初步了解下:DOT 语言。
- 一个用于把 C 函数调用树转换为 dot 格式的脚本:tree2dotx
以 Ubuntu 为例,分别安装它们:
$ sudo apt-get install cflow graphviz
如果确实要用 calltree,请通过如下方式下载。不过 calltree 已经年久失修了,建议不用。
$ wget -c https://gitlab.com/tinylab/linux-0.11/raw/master/tools/calltree
接下来安装 tree2dotx 和 Callgraph,这里都默认安装到 /usr/local/bin
。