2

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

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

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

克里斯托夫

4

1 回答 1

1

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

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

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

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

于 2015-03-14T13:14:00.533 回答