Windows平台下源码分析工具

    最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处、处理过程、理论公式来源、注意事项,自己还没有弄明白的地方。目前的想法是把每一个函数都做成一个名片,这个名片内则包含代码的功能说明、参数说明、函数调用关系图、整体处理过程、注意事项和自己的疑惑这几个部分。而在这个名片内出现的其他函数(包括在文字和调用关系图中出现的)则使用超链接链接到其他函数名片内。然而我并不想自己去手工绘制函数调用关系图,于是就百度了一下,这才发现关于接口文档、说明文档、函数调用关系图这些辅助开发文档早就有人做了专门的软件来高效、有组织地来解决这些问题了。

关于函数调用关系图,在 Linux和 Windows平台下也都有不同的解决方案,搜索一下就能找到很多与之相关的技术文档。目前我是只使用 Windows,这里着重说一下 Windows里中合适的解决方案。

  1. 直接使用 VS自带的关系图功能生成调用关系图。对于 windows平台下经常使用 VS来开发的人来说,这毫无疑问是最简单的方法。不过我并没有用这种方法,一来我看了一下,感觉生成的代码图不够直观,有些函数会被折叠;二来目前我并不打算使用 VS来编译 RTKLIB源码,我现在一直是用 NotePad++来编辑、阅读源码的。

  2. source insight,好是好,可是在别人的博客中看到,说在SI生成的调用关系图中,当两个函数调用同一个底层函数时,该底层函数会分别出现在两个函数调用图的下面,因此这种方法也不能最快的看出那些经常被调用的底层函数,感觉同一幅图中,同一个函数多次出现,看起来就很冗余,也不好。

  3.Doxygen+GraphViz+HtmlHelp,这也是我写这篇博客所想要介绍的。详细内容见 《Windows平台下Doxygen+GraphViz+HtmlHelp自动生成函数调用关系图》(本来想直接转载该篇博客的,但又懒得去联系其作者,遂置一链接于此),下面主要写几个我再按照这篇博客操作时遇到的问题。

    1. 给出的Graphviz的下载目录不可用,如下图1所示。这个问题不难,自己去官网下载 windows版本的就行。这里我下载的版本如图2所示,要注意的是这个不是安装包,直接就可以用,所以某些情况下需要自己设置环境变量。而对于本次和 Doxygen联用,则不需要,因为在新建 Doxygen工程时,需要指定 Graphviz的所在目录。

图 1

图 2

2. 生成的调用图中有时候会包含太多底层函数,使整个图反而变得看上去很乱,如下图3所示。这可以在 Doxygen中进行设置,与之有关的参数有两个,DOT_GRAPH_MAX_NODES和 MAX_DOT_GRAPH_DEPTH,分别控制图中的最大节点数和节点深度,如下图 4所示。节点深度默认为 0,即不进行深度控制,用户可自行设置。只是需要注意,深度也不宜太小。比如对于图 5中的调用关系,当设置深度为 1时,C就不会显示出来。

图 3 MAX_DOT_GRAPH_DEPTH=0时的函数调用图

图 4 

图 5

我也是今天才发现这个神奇的东西,所关于源码分析工具也就先说到这里。前段时间在打算开始阅读 RTKLIB源码时就在想,阅读开源代码有没有什么“黑科技”,当时出于懒惰没有去查找相关的资料,现在吃了苦头才发现,只能说“技术上可以偷懒,想法上不能偷懒”。做事情都有前人的经验和技巧,善用此道,才能真正偷得到懒。

    (最后,我还是要吐槽一下博客园的编辑界面和显示界面,横向上太宽了,真的不如 cmd Markdown写起来方便、美观)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏申龙斌的程序人生

零基础学编程012:画出复利曲线图

通过学习《零基础学编程011:复利数据表问题》,我们已经可以输出365行的《复利数据表》: (1+0.01) ^ 1 = 1.01 (1+0.01) ^ 2 =...

4598
来自专栏编程微刊

highcharts中的x轴如何显示时分秒时间格式

上一篇文章写道:三分钟上手Highcharts简易甘特图:https://www.jianshu.com/p/d669d451711b,在官方文档里面,x轴默认...

1932
来自专栏微信公众号:Java团长

从零讲Java,给你一条清晰地学习道路!该学什么就学什么!

主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二叉搜索A,B,C类熟练,9大排序熟悉。 ...

1531
来自专栏Material Design组件

Human Interface Guidelines —— 搜索栏(Search Bars)

3218
来自专栏架构之路

超清晰的makefile解释、编写与示例

Makefile范例教学 Makefile和GNU make可能是linux世界里最重要的档案跟指令了。编译一个小程式,可以用简单的command来进行编译;稍...

4248
来自专栏小巫技术博客

应用被强杀了怎么办

912
来自专栏吉浦迅科技

DAY64:阅读 Memory Model

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第64天,我们正在讲解CUDA C语法,希望在接下来的36天里,您可以学...

723
来自专栏铭毅天下

干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践

1、题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的【樊登读书会】、得到的每天听本...

2K6
来自专栏Albert陈凯

理解zookeeper选举机制

zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点...

6555
来自专栏向治洪

android开发性能分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项...

2535

扫码关注云+社区

领取腾讯云代金券