c++ - 分析以获取被调用函数的概述

Posted

技术标签:

【中文标题】c++ - 分析以获取被调用函数的概述【英文标题】:c++ - profiling to get an overview of the called functions 【发布时间】:2015-03-13 13:37:47 【问题描述】:

我想分析我的程序不是出于性能原因,而是为了查看程序的逻辑。 如果函数 A 调用 B 然后 C 和 D 它会是这样的:

A  -> B
   -> C -> E
        -> F
   -> D

目前我使用 valgrind/callgrind。它非常有用,但不能完全满足我的需求。我们看不到所有不同的调用堆栈,也看不到函数的调用顺序。 例如,如果我们也有 F->G(但不在堆栈 A->C->F 的上下文中),我们不会做这种区分,我们只看到调用者/被调用者。 我在Unix环境中。 感谢您的帮助,

克里斯托夫

【问题讨论】:

【参考方案1】:

我不知道有什么好的工具可以解决这个问题,除了在调试器中单步执行代码。 如果您使用的是像 Visual Studio 这样的优秀 IDE,则可能有用于跳过 (F10)、进入 (F11) 和退出 (shift-F11) 函数调用的功能按钮。 如果您使用的是 GDB 之类的调试器,则命令为 nsfin

您可能会发现这需要的时间远远超过您的耐心。 在这种情况下,我要做的是继续它(VS 中的 F5,GDB 中的 c)然后暂停它(VS 中的暂停,GDB 中的 Ctl-C)并显示调用堆栈以查看它在哪里以及为什么它在那里。我这样做了好几次。 如果我愿意,我可以从那一点向前走一段时间。 这让我很好地了解了该程序是如何花费大部分时间的,以及为什么。

我不知道有任何其他工具可以用像 C++ 这样的编译语言来传达这种信息。 解释型语言可能有一个跟踪所有函数调用的 trace 工具,但正如我之前所说,数量可能会很大。

gprof 这样的分析器可能能够为您提供一个 调用图,您可以将其与步进相结合,为您提供时间序列。 请注意,它不会包含任何 I/O、睡眠或其他系统等待,但它可能仍然有用。

【讨论】:

以上是关于c++ - 分析以获取被调用函数的概述的主要内容,如果未能解决你的问题,请参考以下文章

为啥C++里面,析构函数会被调用两次

Linux c++ 性能分析工具gprof

信号处理以确保在 C++ 中调用析构函数

c++ 析构函数 是在啥时候执行

C++调用子函数

C++函数调用过程深入分析