2014-01-15 97 views
3

我不能完全記得GCC使用什麼庫來實現堆棧展開,它用於C++異常和調用跟蹤,我知道在C++規範中沒有定義的方法,所以任何答案都是平臺特定的。我正在使用GCC 4.9.0。C++和調用堆棧 - 可以用它來獲取行號嗎?

瞭解哪裏出了問題是非常有用的,特別是在調試過程中。因此,我經常會擴展宏,並在擴展中傳遞__LINE____FILE__

我不是很喜歡這樣做,但它告訴你函數被調用的位置(因爲宏__LINE____FILE__位於調用位置),這非常方便!

與其使用一些基於構建條件定義的可怕宏,不如使用一些使用堆棧展開庫的有條件定義的代碼。

使用了什麼庫?編譯時可以告訴編譯器要記錄多少信息?顯然,對於發佈版本,您只需要進行異常處理。

如果不是什麼約定? C++程序員如何獲得Python和Java程序員認爲理所當然的東西 - 詳細的堆棧跟蹤。

我想一個後備,但不是非常優雅的解決方案將創建一個新的基地,我從中拋出異常,並有一個宏,反映並追加行,文件和__FUNCTION__,但這是一個後備。

我對GCC使用什麼庫和選項給GCC來控制它放入的信息感興趣,所以請分享您的任何知識!

+3

使用像GDB這樣的調試器。當你得到一個核心轉儲時,你會得到一個很好的堆棧跟蹤,只要你用符號編譯(-g3標誌) –

+0

這是關於未捕獲的異常或崩潰? – Paranaix

+0

如果我正確理解他的問題,你想要'__LINE__'之類的東西,而不是'__LINE__'這一行,你想要一個函數被調用的行嗎? – olevegard

回答

0

這裏是另一種選擇,如果你在linux下使用。 1)設計你的信號處理器,所以任何異常都將由你自己的信號處理器來處理,而不是像生成coredump文件那樣的系統。

2)在你的信號處理程序中,只要得到異常,使用系統調用pstack生成跟蹤信息。

like :: system(「pstack yourpid> logfilename」);

相關問題