麒麟系統(tǒng)開發(fā)筆記(十一):在國產(chǎn)麒麟系統(tǒng)上使用gdb定位崩潰異常方法流程進(jìn)階定位代
前言
??上一篇,通過研究,可以定位到函數(shù),本篇進(jìn)一步優(yōu)化,沒有行數(shù),程序較為復(fù)雜的時(shí)候,就無法定位,所以進(jìn)一步定位。
??本篇做了qBreakpad的研究,但是沒有成功,過程也還是填出來,后來突然注意到gdb出現(xiàn)行數(shù)的方法,并通過了幾輪測試以及實(shí)戰(zhàn),確實(shí)可以定位到行數(shù),所以為了大家方便,把國企麒麟上的Qt崩潰方法分享出來。
??本篇文章比較長,就不分篇了,同時(shí)還做了專項(xiàng)測試。
注意
??閱讀者如果一開始有點(diǎn)懵,可能先要看先大致掃一下:《麒麟系統(tǒng)開發(fā)筆記(十):在國產(chǎn)麒麟系統(tǒng)上使用gdb定位崩潰異常方法流程以及測試Demo》,本篇也是解決上一篇探討的遺留問題(只定位了函數(shù),未定位代碼行號(hào))。
使用gdb定位Qt的release(國產(chǎn)麒麟系統(tǒng))
步驟一:修改上一篇demo的pro配置
??(這里是上一篇的demo,只關(guān)注紅框的即可)
??

步驟二:重新編譯調(diào)試還是沒有行號(hào)
???

??

??

??與沒有-g的時(shí)候沒有啥區(qū)別。
步驟三:多加幾層調(diào)用追加堆棧測試
??修改下代碼:
??

??

??測試:
??

??還是沒有堆棧信息:
??

步驟四:懷疑是release版本,改為debug測試
??改為debug版本,也沒有:
??

??不清楚原因,這里博主就沒有深究了
步驟五:路回峰轉(zhuǎn),重啟gdb,成功定位
??研究qBreakpad去了,但是qBreakpad也入深坑了,在爬坑的時(shí)候,突然注意到gdb的bt指令,所以研究了個(gè)把小時(shí)qBreakpad又折回來繼續(xù)了。
??

??至此,出現(xiàn)了行號(hào):
??

配置調(diào)試發(fā)布專項(xiàng)測試
??為了確認(rèn)最簡單的方式,所以進(jìn)行測試:
DEFINES += QT_NO_DEBUG_OUTPUT
DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g
#QMAKE_CXXFLAGS += -g3
測試:debug版本,無-g,不屏蔽qt打印輸出
??

測試:debug版本,有-g的,不屏蔽qt打印輸出
??

??有行號(hào),行號(hào)跟函數(shù)在同一行。
測試:debug版本,有-g的,屏蔽qt打印輸出
??

??有行號(hào),行號(hào)跟函數(shù)在同一行。
測試:release版本,有-g/-g3,有qt屏蔽打印輸出
#DEFINES += QT_NO_DEBUG_OUTPUT#DEFINES += QT_NO_WARN_OUTPUTQMAKE_CXXFLAGS += -g
#QMAKE_CXXFLAGS += -g3
??

??

??

??還試了下-g3:
??

??定位了函數(shù),不定位行號(hào)。
測試:release版本,有-g/-g3,未屏蔽qt打印輸出
??

??所以,最終發(fā)現(xiàn)是不能屏蔽qt打印輸出的,不然是沒有的,跟release或者debug沒有關(guān)系(沒有去論證debug下屏蔽qt打印輸出了)
測試:release版本,無-g,未屏蔽qt打印輸出
??

??所以,無-g也不行
模擬實(shí)戰(zhàn)
??先加了一句代碼:
??

??取消屏蔽qt打印,加上-g:
??

??使用release編譯后,運(yùn)行崩潰:
??

??定位coredump文件:
??

??然后使用gdb的方法:
??

??這里得行是qlist.h的行號(hào),不是我們代碼的行號(hào),所以下標(biāo)錯(cuò)誤估計(jì)就這樣了??梢耘袛喑?,越界也是最后某個(gè)地方調(diào)用指針導(dǎo)致錯(cuò)誤,所以越界當(dāng)時(shí)是不會(huì)有問題,當(dāng)越界在用越界調(diào)用的就把出錯(cuò)的指針調(diào)用出行數(shù)打出來。
??下面試試指針錯(cuò)誤:
??

專項(xiàng)測試結(jié)論
??

入坑
入坑一:gdb不出現(xiàn)行數(shù)
問題
??Gdb調(diào)試不出現(xiàn)行數(shù)
原因
原因1:release與debug問題
原因2:-g問題
原因3:是否屏蔽qt打印問題
??1+2+3,導(dǎo)致情況多種,花了不少時(shí)間定位
解決
??進(jìn)行了專項(xiàng)測試論證,查看“專項(xiàng)測試論證”。
qBreakpad(此方法未通,貼出來參考,有興趣的讀者可以繼續(xù)往下走)
??qBreakpad下載地址:https://github.com/buzzySmile/qBreakpad
git clone --recursive https://github.com/buzzySmile/qBreakpad.git
??好像下下來有點(diǎn)問題,最后還是手動(dòng)下載zip包了:
??

??qBreakpad依賴breakpad和lss
???

??下不下來,另外找把
??breakpad下載地址:https://github.com/google/breakpad
??(最新版報(bào)錯(cuò)),下載v2021.08.09版本
??

??lss:https://github.com/ithaibo/linux-syscall-support
??下載來:

編譯qBreakpad庫
步驟一:下載解壓
??

步驟二:復(fù)制改名依賴庫
??復(fù)制過去并改名:
??

??改完后(先刪除已經(jīng)存在的):
??

步驟三:使用qtcreator打開qBreakpad編譯
??

步驟四:解決錯(cuò)誤“undefined reference to `google_breakpad::PEFile::TryGetDebugInfo(xxxx”,繼續(xù)編譯
??懷疑是版本問題,降低版本試試:
??

??如下,下載解壓后替換:
??

步驟五:解決錯(cuò)誤“*** 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的版本?試一試
??至此,突然發(fā)現(xiàn)gdb的bt,所以這邊停止了。