C 記錄程式崩潰時的dumpfile

2021-06-18 07:22:05 字數 1375 閱讀 2569

新上線的軟體在外場偶爾會出現異常崩潰的情況。由於試用範圍比較分散,很難一一前往現場定位問題。而傳統的log日誌方法,在崩潰的情況下,並不能比較準確的表示出問題位置,這使得軟體除錯程序緩慢。

後在公司前輩的指點下,我們想到了使用window自帶的dumpfile來記錄崩潰時刻的堆疊資訊,這樣配合log日誌記錄,能夠快速的定位出問題點。大大提高了系統除錯效率。

經過一段時間的除錯,現在專案已相對穩定了。想記錄下此方法,以待後續類似情況下使用。

1.//使所有版本都可以捕獲到異常

2.void disablesetunhandledexceptionfilter()

3.21.}

22.23.//程式未捕獲的異常處理函式

24.long winapi exceptionfilter(struct _exception_pointers *exceptioninfo)

25.39.40.    return 0;

41.}

42.43.//把當前時刻的執行緒棧記錄到dump檔案中

44.int recordcurstack()

45.54.55.    return 0;

56.}

57.58.59.bool bcreatedumpthrd = true;

60.//迴圈檢測線程

61.//檢視到有adtv2_temp.txt檔案,則記錄下當前時刻的堆疊

62.void createdumpthrd(void* pv)

63.85.    }

86.}

然後在程式入口將異常處理介面宣告即可。

1.//除錯資訊

2.::setunhandledexceptionfilter(exceptionfilter); //設定異常處理函式

3.disablesetunhandledexceptionfilter();           //獲取未處理的異常

這樣,在程式異常時,就可以在c盤根目錄下記錄乙個dumpfile.dmp的檔案。這個檔案會比較大,一般有100多m,其中資訊比log形式的日誌豐富很多,包括了異常時的堆疊呼叫關係以及各物件的值。,在vs中可以直接開啟。如果保留了和當時編譯軟體一致的**備份的話,可以直接使用vs的debug功能定位到問題**行,否則,debug定位是到彙編**行,看起來比較麻煩。

今天嘗試整合了crashrpt,感覺還不錯,功能很完善,整合也很容易。

然後, 到這裡抄個例子

crashrpt.dll

crashsender.exe

dbghelp.dll

crashrpt_lang.ini

好了,測試下吧,應該會提示程式崩潰,是否傳送crash log的對話方塊。如果傳送,那麼會在email裡收到乙個zip檔案,和乙個zip的md5校驗碼。

程式崩潰時自動記錄minidump的c 類

封裝了乙個c 類,當程式意外崩潰的時候可以生成dump檔案,以便確定錯誤原因。標頭檔案 1 crash dumper w32.h23 ifndef crash dumper h 45 define crash dumper h 67 8 include 9 10class crashdumper 1...

Linux下的C 程式崩潰時列印崩潰資訊

在某些極端情況下,原本正常執行的程式發生了崩潰。這時候想通過除錯是很難發現出錯的地方的,所以在崩潰時列印出錯點的呼叫堆疊是十分有必要的。使用的命令 catchsegv program args 例如 我們的程式是test,則可在控制台輸入 catchsegv test 如果使用gcc g 編譯tes...

golang程式因未知錯誤崩潰時如何記錄異常

開發伺服器程式時如果未經過充分測試,服務穩定執行一段時間後會突然崩潰退出。一般是因為程式 現了某個未捕獲的異常。這類問題屬於偶現的,且需要伺服器執行一段時間之後才會出現,難以定位有問題的 段。這中情況下應該將服務程序的stderr重定向至某個檔案,這樣當程序因未捕獲的異常導致崩潰時,go執行時會將異...