2012-02-18 44 views
0

當我想找到一個段錯誤或任何其他導致程序崩潰的錯誤時,我總是用gdb檢查覈心轉儲。當這樣的應用程序在沒有安裝gdb的計算機上運行時,這非常痛苦。創建一個崩潰日誌

所以前幾天我用一個程序(JDownloader)寫了一個崩潰日誌文件,這個文件包含一個堆棧跟蹤。我認爲這對我的應用會有很大的提升。但是我還沒有找到關於如何在崩潰之前編寫包含堆棧跟蹤的文件的任何信息。

這有可能嗎?我如何在Linux/Windows上執行此操作? 我正在使用C/C++。

+0

如果你碰巧在使用Delphi的Windows上進行編程,「瘋狂的例外」是一個很棒的工具,可以做到這一點:http://madshi.net/ – paulsm4 2012-02-18 17:53:40

+0

看看這裏http://stackoverflow.com/questions/ 691719/c-display-stack-trace-on-exception,它可能是你正在尋找的東西。 – Mithrandir 2012-02-18 17:57:29

回答

2

我相信JDownloader是用Java編寫的。我認爲該語言允許您在任何時候檢索完整的純文本堆棧跟蹤。 C++無法做到這一點,因爲編譯的可執行文件通常不會保存用於生成代碼的任何信息。

Windows API允許您捕獲致命異常並創建進程(或進程的某些部分,如果您不想處理大文件)的轉儲。然後可以使用windbg,Visual Studio或您選擇的調試器來檢查此轉儲。

這樣做的缺點是,您需要必須有具有用於構建轉儲可執行文件的確切源代碼以及構建過程中生成的符號數據庫(PDB文件)。最重要的是,一些代碼可以通過這種方式進行優化,使調試器無法爲您提供精確的堆棧跟蹤,即使使用符號數據也是如此。

有關詳細信息,請參見MiniDumpWriteDump。如果你打算採取這種方式,最好的做法是而不是在崩潰過程中生成轉儲,但產生一個子進程來獲取父進程的轉儲。

還有一些C和C++庫可以「手動」記錄調用堆棧並在運行時爲其提供文本表示,但是我沒有遇到任何我會建議的內容。