前言
上一篇,通過研究,可以定位到函數,本篇進一步優化,沒有行數,程序較爲複雜的時候,就無法定位,所以進一步定位。
本篇做了qBreakpad的研究,但是沒有成功,過程也還是填出來,後來突然注意到gdb出現行數的方法,並通過了幾輪測試以及實戰,確實可以定位到行數,所以爲了大家方便,把國企麒麟上的Qt崩潰方法分享出來。
本篇文章比較長,就不分篇了,同時還做了專項測試。
閱讀者如果一開始有點懵,可能先要看先大致掃一下:《麒麟系統開發筆記(十):在國產麒麟系統上使用gdb定位崩潰異常方法流程以及測試Demo》,本篇也是解決上一篇探討的遺留問題(只定位了函數,未定位代碼行號)。
(這裏是上一篇的demo,只關注紅框的即可)
與沒有-g的時候沒有啥區別。
修改下代碼:
測試:
還是沒有堆棧信息:
改爲debug版本,也沒有:
不清楚原因,這裏博主就沒有深究了
研究qBreakpad去了,但是qBreakpad也入深坑了,在爬坑的時候,突然注意到gdb的bt指令,所以研究了個把小時qBreakpad又折回來繼續了。
至此,出現了行號:
爲了確認最簡單的方式,所以進行測試:
DEFINES += QT_NO_DEBUG_OUTPUT
DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g
#QMAKE_CXXFLAGS += -g3
有行號,行號跟函數在同一行。
有行號,行號跟函數在同一行。
#DEFINES += QT_NO_DEBUG_OUTPUT
#DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g
#QMAKE_CXXFLAGS += -g3
還試了下-g3:
定位了函數,不定位行號。
所以,最終發現是不能屏蔽qt打印輸出的,不然是沒有的,跟release或者debug沒有關係(沒有去論證debug下屏蔽qt打印輸出了)
所以,無-g也不行
先加了一句代碼:
取消屏蔽qt打印,加上-g:
使用release編譯後,運行崩潰:
定位coredump文件:
然後使用gdb的方法:
這裏得行是qlist.h的行號,不是我們代碼的行號,所以下標錯誤估計就這樣了。可以判斷出,越界也是最後某個地方調用指針導致錯誤,所以越界當時是不會有問題,當越界在用越界調用的就把出錯的指針調用出行數打出來。
下面試試指針錯誤:
Gdb調試不出現行數
- 原因1:release與debug問題
- 原因2:-g問題
- 原因3:是否屏蔽qt打印問題
1+2+3,導致情況多種,花了不少時間定位
進行了專項測試論證,查看“專項測試論證”。
qBreakpad下載地址:https://github.com/buzzySmile/qBreakpad
git clone --recursive https://github.com/buzzySmile/qBreakpad.git
好像下下來有點問題,最後還是手動下載zip包了:
qBreakpad依賴breakpad和lss
下不下來,另外找把
breakpad下載地址:https://github.com/google/breakpad
(最新版報錯),下載v2021.08.09版本
lss:https://github.com/ithaibo/linux-syscall-support
下載來:
複製過去並改名:
改完後(先刪除已經存在的):
懷疑是版本問題,降低版本試試:
如下,下載解壓後替換:
步驟五:解決錯誤“*** No rule to make target ‘xxx/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”
“*** No rule to make target ‘…/…/qBreakpad-master/third_party/breakpad/src/client/minidump_file_writer.cc’, needed by ‘_build/obj/minidump_file_writer.o’. Stop.”
那豈不是要降低qBreakpad的版本?試一試
至此,突然發現gdb的bt,所以這邊停止了。