新上線的軟體在外場偶爾會出現異常崩潰的情況。由於試用範圍比較分散,很難一一前往現場定位問題。而傳統的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執行時會將異...