我想分析我的程序不是出于性能原因,而是为了查看程序的逻辑。 如果函数A调用B,那么C和D就是:
A -> B
-> C -> E
-> F
-> D
目前我使用valgrind / callgrind。它非常有用,但并不能完全满足我的要求。我们没有看到所有不同的callstack,也没有看到调用函数的顺序。 例如,如果我们也有 F-> G(但在上下文中不是堆栈A-> C-> F),我们不会做出这种区分,我们只看到呼叫者/被叫者。 我在Unix环境中。 谢谢你的帮助,
克里斯托弗
答案 0 :(得分: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,睡眠或其他系统等待,但它可能仍然有用。