最近在公司項目上遇到程式運行時崩潰,也不好在log日誌中定位。查找了資料發現,谷歌的一個開源項目Breakpad,統一了這三平臺win、linux、mac生成dump的方式來捕捉崩潰。 大致研究了一下,主要依賴一個靜態庫和幾個頭文件,我這邊編譯出來放到網盤上大家自行使用。 鏈接: https://p ...
最近在公司項目上遇到程式運行時崩潰,也不好在log日誌中定位。查找了資料發現,谷歌的一個開源項目Breakpad
,統一了這三平臺win、linux、mac
生成dump
的方式來捕捉崩潰。
大致研究了一下,主要依賴一個靜態庫和幾個頭文件,我這邊編譯出來放到網盤上大家自行使用。
鏈接: https://pan.baidu.com/s/19elsFxnKfzdNaX6cURruAw?pwd=JJLM 提取碼: JJLM
用法就是在工程文件pro里引入庫:
############ for qBreakpad ############ # qBreakpad中需要使用到network模塊 QT += network # 啟用多線程、異常、RTTI、STL支持 CONFIG += thread exceptions rtti stl # without c++11 & AppKit library compiler can't solve address for symbols CONFIG += c++11 macx: LIBS += -framework AppKit # 配置頭文件搜索路徑和鏈接庫路徑 win32:CONFIG(release, debug|release): { LIBS += -L$$PWD/qbreakpadlib/lib/release/ -lqBreakpad DEPENDPATH += $$PWD/qbreakpadlib/lib/release } else:win32:CONFIG(debug, debug|release): { LIBS += -L$$PWD/qbreakpadlib/lib/debug/ -lqBreakpad DEPENDPATH += $$PWD/qbreakpadlib/lib/debug } INCLUDEPATH += $$PWD/qbreakpadlib/include ############ for qBreakpad ############
然後在main.cpp
中添加調用代碼,如下:
1 #include "qBreakpadTest.h" 2 #include <QApplication> 3 4 #include "QBreakpadHandler.h" 5 6 int main(int argc, char *argv[]) 7 { 8 QApplication a(argc, argv); 9 10 QBreakpadInstance.setDumpPath("crashes"); // 設置生成dump文件路徑 11 qBreakpadTest w; 12 w.show(); 13 return a.exec(); 14 }
之後程式如果崩潰會在你設置的路徑位置生成一個bmp文件,拿到這個文件與程式的pdb文件就可以定位到具體某一行了,具體操作方法如下:
我這裡使用VS 2019
,來進行如下的操作。
Vs文件菜單下,選擇“打開”
->“文件”
,如下:(也可以直接選擇拖拽dump文件到Vs也是一樣)
找到dump
文件,並打開,可以看到轉儲摘要
和模塊
等,但是並不能
發現問題何在。如下:
接下來,點擊“設置符號路徑”
,點擊“+”
號,添加pdb文件
路徑,之後,“確定”
。如下:
最後,點擊“使用 僅限本機 進行調試”
,可以很清楚的,定位到崩潰發生的代碼行上。
註意,源碼一定不能變化,哪怕只是更改加入了一行或者什麼空格,都會導致定位錯誤或者只能定位大概位置,所以源碼一定要和編譯出exe時一致。
原文地址:Qt Windows系統使用QBreakpad實戰_qbreakpad vs_Fu_Lin_的博客-CSDN博客