【问题标题】:C++ code dependency / call-graph "viewer"? [closed]C++ 代码依赖/调用图“查看器”? [关闭]
【发布时间】:2018-12-26 01:56:13
【问题描述】:

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

编辑:如果有帮助,我正在使用 VS 2008,但我认为这样的软件无论如何都可以在源文件上运行

【问题讨论】:

  • 对于任何非平凡的程序,输出都必须非常笨重......不过,使用智能 ommision heuristics - 可以工作。
  • 嗯,您不需要非常智能的启发式算法。两到三层深度的截止就足够了。您显然无法显示从main 向下的所有内容。我看到的主要问题是virtual 函数,其中调用的实际实现是在运行时确定的。

标签: c++ refactoring


【解决方案1】:

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

如果CALL_GRAPHHAVE_DOT 标签设置为YES,那么 doxygen 将为每个全局函数或类方法生成一个调用依赖图。请注意,启用此选项将显着增加运行时间。所以在大多数情况下,最好只使用 \callgraph 命令为选定的函数启用调用图。

【讨论】:

    【解决方案2】:

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

    • 显示来电者
    • 显示被调用者

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

    【讨论】:

      【解决方案3】:

      Intel(R) Single Event API 是利用 GraphVis 进行调用图可视化的免费开源项目。进行手动或编译器自动检测需要一些劳动,但除了统计数据和调用图之外,您还将获得加班视图。

      【讨论】:

        【解决方案4】:

        是的,这样的事情存在。 Google 在标题下静态代码分析。例如,有诸如 Understand 之类的工具,您的编译器极有可能也可以做到这一点,我建议您参考它的文档。

        【讨论】:

        • (使用什么编译器?:-/)
        • 我主要使用英特尔 Fortran 编译器,但英特尔 C/C++ 编译器也可以生成调用图。但是,正如 Greg 所建议的那样,Doxygen 可能是一个更好的答案。
        • 如果 a) 存在重载或多重继承(什么,Doxygen 进行了完整的 Koenig 查找?)或者存在间接函数调用,Doxygen 如何成为更好的答案?
        【解决方案5】:

        你可以使用callgrind,它是GUI工具kcachegrind

        【讨论】:

          【解决方案6】:

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

          • 使用 IDE(QtCreator 是免费的,Visual Studio Express 可能也有帮助,Eclipse CDT)
          • 使用 (ctags)[http://ctags.sourceforge.net/] 和功能强大的文本编辑器。
          • 使用 callgrind 和它带来的几个视图。优点:你可以看到真正被调用的函数。缺点:只能在 Unix 上运行,而且你必须进行分析。
          • 使用 Doxygen... 这个非常棒,因为它会生成代码的 html“视图”,前提是您提供正确的选项。

          【讨论】:

            【解决方案7】:

            g++ 和大多数编译器可以做你想做的事。它被称为profiling。还有oprofile。分析器为您提供应用程序after 的执行调用图。这对于研究代码非常有用,您还可以在查看图表时浏览 [debug] 输出。相比之下,代码分析器会为您提供所有可能的调用路径,但是您将无法轻松看到重要的路径。

            【讨论】:

            • 但是分析只会显示那些实际执行的调用图,而不是“所有可能的”。
            • 我相信 profiler 足以理解代码。它简单快捷,会给你基本的想法。对于大图,Doxygen 输出可能会很混乱。
            【解决方案8】:

            VC++2008/2010 profiler 会生成包含此信息的文件 *CallerCalleeSummary.csv。这是解释如何在示例程序中使用它的文章的链接:Profiling of C++ Applications in Visual Studio

            【讨论】:

              猜你喜欢
              • 2010-11-03
              • 2012-06-15
              • 2021-07-18
              • 2012-07-25
              • 2016-06-09
              • 2016-07-12
              • 1970-01-01
              • 1970-01-01
              • 2014-10-09
              相关资源
              最近更新 更多