前言

之前的工作环境习惯了使用source insight查看函数分析代码,切换到mac下后改用vscode,发现缺少函数调用关系图生成。跨平台的understand可以很好的解决,但是公司没有购买,因此需要寻找一个免费、跨平台的替代工具。doxygen + graphviz是不错的选择。

原文参考:https://blog.csdn.net/benkaoya/article/details/79763668

1 介绍

doxygen 是跨平台的工具,官网:http://www.doxygen.nl/

支持Linux、Windows、Mac OS X系统(本文将以Windows版本为例)。

支持C语言在内的多种语言的分析,生成的帮助文档格式可以是CHM、RTF、PostScript、PDF、HTML和Unixman page等。

我使用doxygen的主要目的是生成函数调用关系图,但它能做的远不止于此,它是一款优秀的文档自动生成工具。它可以将代码中的注释转换成帮助文档(注释格式要符合 doxygen 要求才行,FFmpeg API Documentation 就是用doxygen自动生成的),它也可以通过静态分析代码,生成「头文件引用关系图」、「函数调用关系图」、「继承图」以及「协作图」来可视化文档之间的关系。

有了这样的工具,在发布程序版本的同时,发布帮助文档也将变得简单、高效,配合持续集成系统(如Jenkins),自动构建系统,帮助文档可以跟随代码一起实时、轻松的发布版本。

本文主要介绍如何使用 doxygen 生成函数调用关系图,其他功能(如将代码的注释生成帮助文档)不在本文讨论范围内,这是一个入门级的教程。

2 安装

2.1 安装 graphviz

官网:http://www.graphviz.org/

doxygen 自身没办法生成关系图,需要依赖 graphviz 才行,得先安装 graphviz。根据自身系统选择安装的版本。

2.2 安装doxygen

官网:http://www.doxygen.nl/

根据自身系统选择安装的版本。

安装目录下有几个我们需要关心的:

  • 帮助手册:有两种版本,doxygen_manual.chm和html版

  • 配置文件向导:doxywizard.exe,通过这个向导可以快捷地生成配置文件,doxygen.exe 再根据配置文件分析源码,输出各种图和文档

2.3 源码分析

1)运行 doxywizard.exe,配置 Wizard > Project 页面

点击 Wizard 选项卡,如下图所示:

2)选择程序语言

根据实际情况选择,我这里选择C

3)配置 Expert > Project 页面

3)配置 Expert > Build页面

4)配置 Expert > Dot页面

至此,配置完毕,可以通过 File > Save 菜单将上面所有配置导出(保存)到配置文件,以免丢失配置,配置文件默认保存在 Step1 设置的工作目录下。

当然你也可以通过 File > Open 菜单导入(打开)一个现有的配置文件。可以打开配置文件看看,里面参数非常多,doxywizard 图形化的便捷性也就体现在这里。

5)分析源码

Run 选项卡,点击 Run doxygen 按钮,幕后就会根据刚才的配置执行 doxygen.exe 命令:

6)查看分析结果

等分析完毕,最后点击 Show HTML output 按钮就会启动浏览器显示分析结果,如下图所示:

7)查看doxygen分析后的结果

点开文件列表

头文件包含关系图与函数调用关系图如下,从图中可以发现,doxygen不会显示调用的系统API。

doxygen+graphviz轻松绘制函数调用图(call graph)的更多相关文章

  1. 看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph)

    一.Graphviz + CodeViz简单介绍 CodeViz是<Understanding The Linux Virtual Memory Manager>的作者 Mel Gorma ...

  2. 看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph) - 转

    From http://www.linuxidc.com/Linux/2015-01/111501.htm 实际按照上文操作,主要是安装gcc-4.6.2出现一些问题,原先在cygwin下安装,结果提 ...

  3. 分析函数调用关系图(call graph)的几种方法

    绘制函数调用关系图对理解大型程序大有帮助.我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历.如果运气好一点,借助调试器的单步跟踪功能和call sta ...

  4. 转+更新 Graphviz 教程,例子+ 高级应用 写代码,编程绘制架构图(分层拓扑图) 转自官网

    1. Graphviz介绍 Graphviz是大名鼎鼎的贝尔实验室的几位牛人开发的一个画图工具. 它的理念和一般的“所见即所得”的画图工具不一样,是“所想即所得”. Graphviz提供了dot语言来 ...

  5. 用Doxygen+Graphviz生成函数调用流程图(转)

    源文链接: http://wildpointer.net/2012/04/14/doxygen_graphviz/ 上面这张图是用Doxygen+Graphviz从netcat的源代码生成的函数调用关 ...

  6. Graphviz绘制百家争鸣图

    最近读易中天<先秦诸子百家>,一边读一边在纸上画出逻辑关系,图越来越复杂,趁中午休息索性就把图用Graphviz重新绘制了一下;由于Graphviz主动承担了绘图排版的职责,我只需要关注内 ...

  7. 使用Doxygen + graphviz生成Unity 3d的UGUI类图

    下载软件 1) Graphviz,下载地址:http://download.csdn.net/detail/u010953266/8591169 为什么不用官网?一是下载速度慢,二是下载到本地的文件貌 ...

  8. 【转】doxygen+graphviz生成工程中的类继承树及函数调用图

    转自----hequn8128 在阅读代码量比较多的项目时,类的继承树和函数调用图能够直观地向我们显示类之间或者函数之间的各种关系,方便我们了解程序的整体框架,很多时候可以起到事半功倍的作用.这里尝试 ...

  9. doxygen+ graphviz 开源工具生成源码调用树的wiki

    当拿到一含有大量代码的工程怎么看?!这时一个好的代码分析工具非常有用,网上有很多开源工具,但资料都参差不齐,偶然发现doxygen+ graphviz这两工具非常棒,使用工具直接生成函数调用链图,帮助 ...

随机推荐

  1. 2019-2020-1 20199329《Linux内核原理与分析》第五周作业

    <Linux内核原理与分析>第五周作业 一.上周问题总结: 虚拟机将c文件汇编成汇编文件时忘记添加include<stdio.h> gdb跟踪汇编过程不熟练 二.本周学习内容: ...

  2. QT使用提升自定义组件

    QT使用提升自定义组件 QTC++QT自定义 QT 组件提升来实现自定义功能 介绍 我们在使用QT设置界面之后,往往需要自己实现一些方法,如果是单独 的还好,但是如果遇到很多同类型的都有需求, 比如 ...

  3. vuex vue-devtools 安装

    vue-devtools是一款基于chrome游览器的插件,用于调试vue应用,这可以极大地提高我们的调试效率.接下来我们就介绍一下vue-devtools的安装 chrome商店直接安装 谷歌访问助 ...

  4. 《PostgreSQL服务器编程》一一1.3 超越简单函数

    本节书摘来自华章计算机<PostgreSQL服务器编程>一书中的第1章,第1.3节,作者:(美)Hannu Krosing, Jim Mlodgenski, Kirk Roybal 著,更 ...

  5. 全面解析Java语言 Java技能优化集锦

    通用篇 "通用篇"讨论的问题适合于大多数Java应用. 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如果一个对象实现了C ...

  6. DB2 Zos 浅谈 - DB2 LUW VS DB2 Zos

    DB2 Zos 浅谈 - DB2 LUW VS DB2 Zos 概述: 各位可能对DB2 LUW了解得比较多,但对DB2 Zos(大机操作系统)知之甚少,因为IBM的内部资料一向是比较封闭的,特别是我 ...

  7. js中的filter

    filter是常说的增删改查中的'查',当对一个数组进行筛选时,经常会使用indexOf 和es6中的includes()方法.filter是es5中的一种迭代方法,其定义为:对数组中的每一项运行给定 ...

  8. 网速慢?不!可能是DNS出了问题! 公共DNS优选之 BAT 百度、腾讯、阿里、谷歌DNS哪个更快?

    如果一下还是解决不了你的问题请这边走 首先是Google的DNS: 8.8.8.8 丢包严重 PASS但是扶墙的时候是必备的,如果有扶墙的需求的话可以备用. 二.百度DNS 180.76.76.76 ...

  9. C++类学习(2)

    Ⅰ:类概念 一:类的构成 class 类名 { public: 公有数据成员和成员函数:类的接口 protected: 保护数据成员和成员函数: private: 私有数据成员和成员函数: }://注 ...

  10. python(面向对象-类封装调用)

    一.面对对象思想 (1)大家肯定听过 Python 中”一切皆对象“的说法,但可能并不了解它的具体含义,只是在学习的时候听说 Python 是面向对象的编程语言,本节将向大家详细介绍 Python 面 ...