绘制函数调用图(call graph)(1):专栏开篇

本文探讨了绘制函数调用图(callgraph)的重要性及其应用场景,包括大型项目、缺乏文档资料及第三方代码库的情况。介绍了手动绘制与使用工具自动绘制的区别,并详细分类为静态分析和动态分析两种方式。通过对比多种工具,如cflow、codeviz和doxygen等,为读者提供了实用的选择建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绘制函数调用关系图(call graph),对开发人员理解源码有非常大的帮助,特别是在以下情况:

  • 大型项目,庞杂的代码量;
  • 项目文档缺失,特别是设计文档、流程图的缺失;
  • 第三方代码库,如开源项目;
  • 检查实际函数调用关系跟规划的设计是否一致,以免出错。

绘制函数调用关系图的途径主要有两种,一种是人工手动绘制(很多人应该都有一边看代码(或借助调试工具单步跟踪),一边在纸上画函数调用关系图的经历),另一种是使用工具自动绘制。

自动分析函数调用关系的工具,主要分为「静态分析」和「动态分析」两种。所谓静态分析是指在不运行待分析的程序的前提下进行分析,那么动态分析自然就是记录程序实际运行时的函数调用情况了。更详细的分类,可以参考以下文章:
https://blog.youkuaiyun.com/solstice/article/details/488865

动态调用图是精确的,但仅描述程序的一次运行。 静态调用图是旨在表示程序的每个可能运行的调用图。 确切的静态调用图是一个不可判定的问题,所以静态调用图算法通常是过度的。 也就是说,发生的每个调用关系都在图中表示,并且可能还有一些调用关系在程序的实际运行中永远不会发生。

以下网址列举了这方面的工具:
https://en.wikipedia.org/wiki/Call_graph

大部分的工具,都是将函数调用关系的分析结果以文本的形式输出,你还需要利用第三方工具将文本文件转为图片文件,大部分都是使用可视化工具 graphviz 转化为图片(这个转化过程涉及到 dot 语言)。

针对C/C++语言,我体验了几款开源的、静态分析的工具:cflow、codeviz 和 doxygen,看看效果如何。截止书稿,前两者用的的人已经越来越少了,用doxygen的比较多,从谷歌趋势图就能看出这点:


谷歌趋势图

以下是我体验过程,把他们整理出来供大家参考。

绘制函数调用图(call graph)(2):cflow + graphviz
绘制函数调用图(call graph)(3):codeviz + graphviz
绘制函数调用图(call graph)(4):doxygen + graphviz

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值