最近这段时间在阅读 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写起来方便、美观)