C++ C++;“代码依赖关系/调用图”;观众;?

C++ C++;“代码依赖关系/调用图”;观众;?,c++,refactoring,C++,Refactoring,是否有一种(免费)工具可以显示给定函数中所有函数调用的图形? 例如,如果我在一个复杂函数fun()上使用它,我试图理解它,它会按顺序显示fun()调用的所有函数,然后我有可能看到fun()调用的函数的相同内容,等等。 我正在寻找C++代码。 这样的事情真的存在吗 编辑:如果有帮助的话,我正在使用VS2008,但我认为这样的软件无论如何都可以在源文件上工作是的,这样的东西是存在的。谷歌的标题是静态代码分析。例如,有一些工具,如,而且您的编译器也很可能可以做到这一点,请参阅其文档。可以做到这一点。请

是否有一种(免费)工具可以显示给定函数中所有函数调用的图形? 例如,如果我在一个复杂函数fun()上使用它,我试图理解它,它会按顺序显示fun()调用的所有函数,然后我有可能看到fun()调用的函数的相同内容,等等。 我正在寻找C++代码。 这样的事情真的存在吗


编辑:如果有帮助的话,我正在使用VS2008,但我认为这样的软件无论如何都可以在源文件上工作

是的,这样的东西是存在的。谷歌的标题是静态代码分析。例如,有一些工具,如,而且您的编译器也很可能可以做到这一点,请参阅其文档。

可以做到这一点。请参阅配置选项:

如果
CALL\u GRAPH
HAVE\u DOT
标记设置为
YES
,则doxygen将为每个全局函数或类方法生成调用依赖关系图。请注意,启用此选项将显著增加运行时间。因此,在大多数情况下,最好仅使用\callgraph命令为选定函数启用调用图


g++和大多数编译器可以做你想做的事情。它被称为。还有一个问题。探查器在应用程序执行后为您提供应用程序的调用图。这对于学习代码非常有用,您还可以在查看图形时浏览[debug]输出。相反,代码分析器将为您提供所有可能的调用路径,但是,您将无法轻松查看重要路径。

是的,Eclipse CDT视图正好提供了这一点。此外,此视图有两个选项:

  • 显示来电者
  • 显示被叫者

你问的是第二个,但我更喜欢代码分析中的第一个。

我不知道有专门为此设计的工具。但是,有几种方法可以做到这一点:

  • 使用IDE(QtCreator是免费的,VisualStudioExpress也可能有帮助,EclipseCDT)
  • 使用(ctags)[http://ctags.sourceforge.net/]和一个有能力的文本编辑器
  • 使用callgrind及其带来的几个视图。优点:您可以看到真正被调用的函数。缺点:只在Unix中运行,您必须配置文件
  • 使用强氧剂。。。如果您提供了正确的选项,这一个就可以生成代码的html“视图”

您可以使用callgrind及其GUI工具。

VC++2008/2010探查器会生成包含此信息的文件*CallerCalleeSummary.csv。这是一篇文章的链接,解释了如何在示例程序中使用它:

是一个免费的开源项目,它利用GraphVis进行调用图可视化。手动或编译器自动插装需要一些劳动,但除了统计数据和调用图之外,您还将获得超时视图。

对于任何非平凡的程序来说,输出都会非常笨拙。。。不过,使用智能的Omision启发法——可能会奏效。嗯,你不需要非常智能的启发法。两个或三个深度的截止线就足够了。显然,您无法显示从
main
到下的所有内容。我看到的主要问题是
virtual
函数,其中调用的实际实现是在运行时确定的。可能重复(您使用的编译器是什么?:-/)我主要使用英特尔Fortran编译器,但英特尔C/C++编译器也可以生成调用图。但是,正如Greg所建议的那样,Doxygen可能是一个更好的答案。如果a)存在重载或多重继承(什么,Doxygen进行完整的Koenig查找?)或者存在间接函数调用,那么Doxygen怎么可能是一个更好的答案呢?但是分析只会显示那些实际执行的调用图,而不是“所有可能的”.我相信探查器足以理解代码。这是简单和快速做,将给你的基本想法。对于大型图形,Doxygen输出可能会很混乱。