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 之类的调试器,则命令为 n
、s
和 fin
。
您可能会发现这需要的时间远远超过您的耐心。
在这种情况下,我要做的是继续它(VS 中的 F5,GDB 中的 c
)然后暂停它(VS 中的暂停,GDB 中的 Ctl-C)并显示调用堆栈以查看它在哪里以及为什么它在那里。我这样做了好几次。
如果我愿意,我可以从那一点向前走一段时间。
这让我很好地了解了该程序是如何花费大部分时间的,以及为什么。
我不知道有任何其他工具可以用像 C++ 这样的编译语言来传达这种信息。 解释型语言可能有一个跟踪所有函数调用的 trace 工具,但正如我之前所说,数量可能会很大。
像 gprof 这样的分析器可能能够为您提供一个 调用图,您可以将其与步进相结合,为您提供时间序列。 请注意,它不会包含任何 I/O、睡眠或其他系统等待,但它可能仍然有用。
【讨论】:
以上是关于c++ - 分析以获取被调用函数的概述的主要内容,如果未能解决你的问题,请参考以下文章