使用Doxygen + Graphviz可视化一个庞大的C++项目

11

我接手了一个庞大的C++项目,需要将其移植到Linux。该项目包含超过300个文件和20万行代码。如果能够有一个可视化的依赖和包含关系树,我就可以更好地了解应用程序的内部结构,并定位核心模块和Windows头文件之间的“故障线”,以便稍后进行存根操作。

Visual Studio中的类查看器并不能满足我的需求。我搜索了一下,了解到Doxygen是常用的列出依赖项的工具。但我相对比较视觉化,发现这并没有什么帮助。幸运的是,我了解到了Graphviz插件,使用名为“Dot”的工具,使我能够生成部分的依赖树。但不幸的是,针对特定文件产生了数百个较小的依赖树,而不是我所希望的一个大的依赖树。以下是一些示例:

DoxygenDDLCommInfC DoxygenDDBItemBase

正如您所见(希望如此),当图形变得太大时,Doxygen/GraphViz似乎会放弃并使子节点变灰色。然后,如果我想查看树下的内容,就必须转到该特定节点的图形中。这不仅限制了图形的可视化帮助性,而且如果子节点依赖于原始图形中的任何节点,则这些节点将再次显示。这导致出现大量重复连接,使得难以从任何给定文件中概念化地隔离图形。因此,我感觉就像是“放大”,但仍然无法看到整个画面。

我尝试在Doxygen的Expert视图中使用DOT_GRAPH_MAX_NODES设置进行操作,但这似乎并没有影响所生成图形的范围。从任何给定运行生成的输出来看,似乎Doxygen本身正在生成数百个图文件,而Graphviz只是忠实地为每个文件生成图形。是否有任何已知的方法可以使Doxygen生成一个大的图形文件而不是数百个小的文件?

或者,是否有任何免费的可视化图形解决方案可以像Doxygen一样处理具有嵌套预处理器指令、MIDL接口和手动定义的包含路径的复杂C++项目文件?

我的搜索结果发现了一些常规的图形实用程序(或涉及这些程序的问题),但没有关于大型C++项目的具体信息。随着多年来编码量的增加,肯定有人拥有这样的工具!

谢谢, -Alex

1个回答

6
你可以使用doxygen生成的XML文件,并将它们合并成一个巨大的dot格式图形文件(使用xml样式表或类似的工具),然后在该文件上运行graphviz。当图形数量很多时,Doxygen自动调用graphviz非常有用。对于单个图形,自动创建内容很重要,但自动调用dot就不那么重要了。

嗯,我觉得这并不能解决重复节点的问题。例如:图A包含节点B和C(它们各自有自己的图)。图B也包含节点C。因此,如果合并图A和图B,节点C将会被重复包含。:-/ - Alex Jansen
2
@Alex:在图形上,所有对同一节点名称的引用都会折叠成单个节点。这就是graphviz语言的工作方式。(我鼓励你尝试我的建议,然后再抱怨它是否可行,毕竟你是刚接触graphviz) - Ben Voigt
谢谢,我不知道它可以处理那么多。正如你建议的那样,我现在正在尝试根据Doxygen的XML文件生成一个新的GraphViz图形。我通过运行Doxygen生成的combine.xlst文件上的xsltproc将它们合并为“all.xml”文件。(这让我花了三个小时来解决)不幸的是,我对如何处理它毫无头绪。我如何让GraphViz加载我的all.xml文件并将其转换为图形呢? - Alex Jansen
@AlexJansen 你最终的设置是什么?我也在尝试处理一个非常大的图形。我已经得到了XML输出,现在正在尝试将其合并为单个XML,然后转换为DOT格式,并在最后使用Graphviz进行处理。这是我目前看到的流程。 - ConductedForce
@ConductedForce 在意识到代码本身没有合理的类层次结构之后,我放弃了追求更大图形的想法。我能够生成的图表显示几乎每个类都依赖于几乎每个其他类,并且有这么多的线交叉在一起,以至于打印机墨水混在一起。将缩放全部输出不会使该代码变得更清晰。相反,他们将我们带到德克萨斯州与原始作者进行培训,他们似乎也几乎不理解自己的代码。我希望你的情况不像那样。 - Alex Jansen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接