2014-02-06 60 views
1

在有很多功能,很多電話,我想在屏幕打印或記錄儀的任何功能的回溯與例如任何額外的信息大碼:回溯在C++

主要調用函數A和A調用函數B調用函數C.

如果我在函數中放置打印,CI會希望它打印main::A::B::C - [any parameter value for debugging]或任何其他格式。

這將幫助我調試我面臨的更快的問題。

注意:對於那些會回答我可以在每個功能上打印的人,正如我所說的許多呼叫和許多流程一樣。

+3

你知道'gdb'的存在嗎?它具有內置的這些功能。我敢打賭,幾乎所有的調試器都是值得的。 – Floris

+4

可能要指定平臺/工具鏈,因爲任何答案都是平臺特定的。 – Eugene

+0

平臺是linux。 – Nizarazo

回答

2

如果您使用的是g ++,則可以使用函數backtrace or backtrace_symbols獲得堆棧回溯。

挑戰是在引發異常的位置捕獲堆棧跟蹤的內容,然後將其傳輸到發生異常的位置。爲此,您可以使用Boost.Exception。創建boost :: exception的子類,然後在構造函數中捕獲棧回溯。稍後,在捕捉異常時,可以打印出痕跡或以其他方式使其可用。

另一個問題是C++符號名稱會被損壞。如果你想讓它們可讀,你可以調用abi::__cxa_demangle(同樣,特定於g ++)。

從上面可以看出,答案是平臺特定的。其他編譯器和運行時環境可能有類似的解決方案。

+0

在Windows XP和更高版本中,您需要[CaptureStackBackTrace](http://msdn.microsoft.com/en-us/library/windows/desktop/bb204633(v = vs.85).aspx)和[SymFromAddr](http ://msdn.microsoft.com/en-us/library/windows/desktop/ms681323(v = vs.85)的.aspx)。 – MooseBoys

+0

harmic謝謝你的回覆,我用它,這是非常有幫助的。 你知道有什麼方法可以用被調用函數的行和文件名打印回溯圖嗎? – Nizarazo

+1

@Nizarazo如果你用-g編譯你的代碼,那麼符號和源代碼之間的映射應該出現在已編譯的程序中。從理論上說,您可以使用addr2line命令將其轉換爲file:line。儘管如此,我還沒有取得太大的成功。 – harmic