2015-03-13 45 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,睡眠或其他系統等待,但它可能仍然有用。