我有大量用C编写的代码,但并不是我自己写的。我希望在代码中创建一个调用结构的概述以供参考。也就是说:我希望知道代码中的不同函数调用了哪些(非标准)函数,从而创建不同函数的层次结构或树。是否有任何免费的 Unix 兼容程序(这意味着没有 Visual Studio,但有一个 Vim 插件或类似的程序就可以做到这一点)可以做到这一点,或者我必须自己编写一些可以做到这一点的东西吗?
Doxygen 也可以这样做,但必须启用它。
有关可用工具的概述,请参阅 http://en.wikipedia.org/wiki/Call_graph
有一个 Vim 插件 C Call-Tree Explorer 称为 CCTree http://www.vim.org/scripts/script.php?script_id=2368
正如您提到的 Vim 插件,请查看 http://sites.google.com/site/vimcctree/。它使用 CScope 生成树,因此您需要首先生成源文件的 CScope 数据库。
看看 http://www.gson.org/egypt/ 它使用 GCC 处理代码并从它发出的 AST 中提取程序内的相互依赖关系。
gprof 会做到这一点。它还生成一个执行配置文件,但这样做会创建一个调用树。
我刚刚下载了 SourceTrail (https://github.com/CoatiSoftware/Sourcetrail/releases),它做了我想要的,这非常接近我认为你想要的。
(我想要的是找出哪些例程调用了我正在考虑更改或需要理解的函数)。
请注意,它不再维护,但它完全符合我的要求。 它在 Windows 和 Linux 下运行,并且使得查找谁调用函数变得非常简单(以及根据需要跟踪该函数的调用树)。如果你关心的话,它有一个 GUI(是 GUI?无论如何)。
它自己进行解析,但运行时间并不长,可能与编译代码的时间差不多或稍短。
但是,如果您只想要文本,或者不想使用 GUI,或者不想让它扫描代码,那么这不适合您。
(注释 - 就我而言,我过度关注一两个函数,并且不关心正在调用哪些系统函数。我花了一些时间删除所有需要的包含文件(因为我运行了解析在一台没有我正在查看的 Windows 程序所需的所有包含文件的机器(一台 Linux 机器)上,然后在另一台(Windows)机器上进行探索,我应该提到,它工作得很好。只需将整个源代码树从我的 Linux 计算机复制到我的 Windows 计算机(其中包括 Sourcetail 项目文件),加载 Sourcetail 并让它加载项目 - 完成。)
clang++
(C 预处理器)和 opt
(llvm 优化器)可用于生成带有图形的点文件。然后dot
就可以用来生成绘图了。
示例:
clang++ -S -emit-llvm main.c -o - | \
opt -enable-new-pm=0 -dot-callgraph && \
mv -v "<stdin>.callgraph.dot" callgraph.dot && \
dot -Tpng -ocallgraph.png callgraph.dot
这适用于 clang/llvm 14,其他版本可能需要一些不同的参数(例如,较旧的
opt
可能需要 -analyse
而不是 -enable-new-pm=0
)。