【问题标题】:Is there a way to get a call graph for certain c++ function in Visual Studio?有没有办法在 Visual Studio 中获取某些 c++ 函数的调用图?
【发布时间】:2013-04-17 21:21:44
【问题描述】:

我想知道是否有 VS 工具可以显示给定 C++ 函数的调用图(即列出所有可能执行路径的图)。在仅在少数地方调用函数的情况下,它有助于导航大型代码库。

对于像printf 这样经常调用的函数,它可以简单地说:

选项太多...

再次,我想制作这样的工具并不容易,所以我想知道它是否存在,但你知道它似乎可以做到,所以你永远不知道...... :)

编辑:我知道查找所有引用,但这只是给出函数的调用点,而不是调用函数的函数的调用点...

编辑:VS 是 2010,但如有必要,可以选择 VS2012。

【问题讨论】:

  • 如果你想要的只是静态分析,我认为这并不牵强。否则,任何形式的动态调度,都是白日梦..
  • 调试器会给你堆栈树。另外,看看Windows下的StackWalk64(),你可以用它从你的程序中获取堆栈树。
  • @PetrBudnik,这不是他的问题。他的问题更倾向于提前知道什么调用堆栈会到达特定函数。
  • @PetrBudnik 从理论上讲,如果您可以分析代码并知道哪些函数调用了其他函数 - 然后您可以从特定函数追溯您的步骤并创建堆栈跟踪(不是真实的,更多一棵树的),它将显示任何功能可能到达的每一种可能的方式。
  • @Moo-Juice 我想,我对术语感到困惑。我想,你说的是call graph,而不是call stack。以codeviz 为例。

标签: c++ visual-studio


【解决方案1】:

您提到您知道如何查找所有参考资料。您是否考虑查看Call Hierarchy?这可能不是您的“梦想方法”,但它确实允许您根据给定函数的“调用”和“调用”来查看函数。该窗口还允许您添加多个功能以树格式查看。所以基本上你会在可能的结果中向上或向下遍历。

右键单击所需的方法(可以在层次结构中的任何位置)=>

选择“查看调用层次结构”

请注意,如果您可以向窗口添加多个参考点。需要时删除

你也可以使用 Ctrl+K 或 Ctrl+T


另一个很好的例子,恕我直言,对 C++ 和 C# 与 VS 之间的差异感到失望。我认为Code Maps 正是您想要的。当然,假设您使用的是 Ultimate,但不是,不是使用 C++。

【讨论】:

  • 也适用于 VS2015,这是语法而非文本,就像其他一些答案一样。
【解决方案2】:

据我所知,C++/MSVC 中没有这样的功能。

但是,Windows 的 AQTime 分析器具有“静态分析”选项(如果我没记错的话)扫描已编译的可执行文件、生成调用图并向您显示无法访问的函数。

如果我没记错的话,AQtime 集成到了 Visual Studio(专业版,afaik)中。

不幸的是,这是一个售价约 500 美元的商业分析器,并且此功能在试用版中不可用。我上次使用静态分析是在 3..4 年前,我现在不完全记得细节(而且我再也无法访问 AQTime)。无论如何,它是一个专门的工具,所以我不建议您购买它,除非您正在优化代码以实现 24/7 速度。

也许,通过谷歌搜索“静态分析”、“代码覆盖率”或研究其他分析器,您会发现一些类似的工具可以免费完成这项工作。

除此之外,doxygen 还可以为 C++ 代码生成调用图。在 doxygen 的情况下,您将不得不寻找自己从未调用过的函数。

此外,Visual Studio 2008 有一个内置的调用者图表功能(我认为它使用了智能感知)。基本上,你右键单击任何函数并选择“显示调用者”(或类似的东西),这将在一个窗口中打开所有函数的列表(visual studio THINKS 正在调用你的函数)。因为这个特性在 VS2008 中存在,它应该包含在 VS2010 中。但是,由于明显的原因(虚拟方法、回调等),它无法检测到每个调用者。

【讨论】:

    【解决方案3】:

    也许 doxygen 是您正在寻找的工具。它提供了生成调用图(显示由特定函数调用的所有函数)和/或调用者图(显示直接或间接调用该函数的函数)的可能性。

    见:http://www.doxygen.nl/manual/diagrams.html

    【讨论】:

    • 我也只能推荐doxygen。配置它可以为您提供一个包含所有调用图的 html 可浏览文档。 Afaik 还有可能在 VS 中包含 doxygen 创建的文档。这些图表将由 graphviz 绘制,它确实有助于掌握大型代码库。
    【解决方案4】:

    查看了解工具 (http://www.scitools.com)。它非常适合绘制调用图和控制流程图。不幸的是,它是商业的。

    【讨论】:

      【解决方案5】:

      您可以在进行符号搜索后解析结果。只需右键单击您的源代码,然后选择查找所有执行符号搜索的引用。在http://blogs.msdn.com/b/vcblog/archive/2009/11/17/improvements-to-find-all-references-in-visual-studio-2010.aspx

      有更详细的解释

      【讨论】:

      • 结果图是文本而不是重言式排序图,需要习惯,例如。右键单击符号以查找参考,而不是在视觉顶点之间转移焦点以沿边缘导航。
      【解决方案6】:

      您可以尝试CppDepend,它为您提供了 VS 内部的调用图,并在其依赖图中提供了许多功能。

      【讨论】:

        【解决方案7】:

        Source Navigator 是我在 C++ 项目中使用过并且非常满意的一个工具。同样,它不在 Visual Studio IDE 中,但如果您不介意按 Alt-Tab ,它有一些很大的优势:-)

        • 适用于 C 和 C++ 源代码
        • 的索引和搜索速度相当快;使用起来很愉快,恕我直言
        • 是一个可视化工具
        • 是一款免费的开源工具

        部分截图见http://sourcenav.berlios.de/screenshots/

        特别是,您正在寻找Cross-Reference Browser

        "它可以找到函数的每一个调用,或者告诉你所有的 特定的函数调用。它创建显示树形图 项目符号数据库中的基本关系,例如 函数调用层次树。你可以上下遍历 层次树,以及扩展或限制树。你可以选择 层次结构中的项目并显示它们的引用和引用者 关系;这些关系是基于“观点”的 选定的符号。”

        尽管本教程的示例屏幕截图"Using the Cross-Reference Browser" 显示的是类而不是函数的引用关系(使用红色箭头),但后一个用例将非常相似。您还可以浏览从函数中调用了哪些函数/方法,这将是一种引用关系,使用蓝色箭头而不是红色箭头显示。

        试试吧!正如我之前提到的,我一直是这个工具的快乐用户。它不是很有名,但它是一个很好的软件(这也是 Tcl/Tk 在右手中的有用性的一个例子)。

        【讨论】:

          【解决方案8】:

          我认为您应该能够在您的解决方案上使用 VS Plugin - CodeGraph 并寻找您正在寻找的特定功能并从那里继续。它对您的解决方案进行静态分析,并生成一个很好的调用流图。检查“https://marketplace.visualstudio.com/items?itemName=YaobinOuyang.CodeAtlas”。希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2022-01-05
            • 1970-01-01
            • 2010-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-09
            • 1970-01-01
            相关资源
            最近更新 更多