2015-03-13 44 views
1

我想分析我的程序不是出于性能原因,而是查看程序的逻辑。 如果函数A调用B,则C和D这将是这样的:C++ - 分析以获得被调用函数的概述

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

目前我使用的valgrind/callgrind。这是非常有用的,但没有正确回应我的要求。我们没有看到所有不同的调用堆栈,我们也看不到调用函数的顺序。例如,如果我们也有 F-> G(但不在上下文中,A-> C-> F),我们不会做出这种区分,我们只会看到呼叫者/被呼叫者。 我在Unix环境下。 感谢您的帮助,

克里斯托夫

回答

0

我不知道这一个很好的工具,比在调试器步进代码等。 如果您使用的是像Visual Studio这样的好IDE,可能会有函数按钮用于逐步调用(F10),调入(F11)和调出(shift-F11)函数调用。 如果您使用的是像GDB这样的调试器,则命令为nsfin

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

我不知道有任何其他工具可以像C++这样的编译语言传递这种信息。 解释型语言可能有跟踪所有函数调用的跟踪工具,但正如我之前所说的那样,卷可能是压倒性的。

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