麒麟系統開發筆記(十一):在國產麒麟系統上使用gdb定位崩潰異常方法流程進階定位代碼行數及專項測試Demo

前言

  上一篇,通過研究,可以定位到函數,本篇進一步優化,沒有行數,程序較爲複雜的時候,就無法定位,所以進一步定位。
  本篇做了qBreakpad的研究,但是沒有成功,過程也還是填出來,後來突然注意到gdb出現行數的方法,並通過了幾輪測試以及實戰,確實可以定位到行數,所以爲了大家方便,把國企麒麟上的Qt崩潰方法分享出來。
  本篇文章比較長,就不分篇了,同時還做了專項測試。

 

注意

  閱讀者如果一開始有點懵,可能先要看先大致掃一下:《麒麟系統開發筆記(十):在國產麒麟系統上使用gdb定位崩潰異常方法流程以及測試Demo》,本篇也是解決上一篇探討的遺留問題(只定位了函數,未定位代碼行號)。

 

使用gdb定位Qt的release(國產麒麟系統)

步驟一:修改上一篇demo的pro配置

  (這裏是上一篇的demo,只關注紅框的即可)
  在這裏插入圖片描述

步驟二:重新編譯調試還是沒有行號

   在這裏插入圖片描述

  在這裏插入圖片描述

  在這裏插入圖片描述

  與沒有-g的時候沒有啥區別。

步驟三:多加幾層調用追加堆棧測試

  修改下代碼:
  在這裏插入圖片描述

  在這裏插入圖片描述

  測試:
  在這裏插入圖片描述

  還是沒有堆棧信息:
  在這裏插入圖片描述

步驟四:懷疑是release版本,改爲debug測試

  改爲debug版本,也沒有:
  在這裏插入圖片描述

  不清楚原因,這裏博主就沒有深究了

步驟五:路回峯轉,重啓gdb,成功定位

  研究qBreakpad去了,但是qBreakpad也入深坑了,在爬坑的時候,突然注意到gdb的bt指令,所以研究了個把小時qBreakpad又折回來繼續了。
  在這裏插入圖片描述
  至此,出現了行號:
  在這裏插入圖片描述

 

配置調試發佈專項測試

  爲了確認最簡單的方式,所以進行測試:

DEFINES += QT_NO_DEBUG_OUTPUT
DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g 
#QMAKE_CXXFLAGS += -g3

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

  在這裏插入圖片描述

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

  在這裏插入圖片描述

  有行號,行號跟函數在同一行。

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

  在這裏插入圖片描述

  有行號,行號跟函數在同一行。

測試:release版本,有-g/-g3,有qt屏蔽打印輸出

#DEFINES += QT_NO_DEBUG_OUTPUT
#DEFINES += QT_NO_WARN_OUTPUT
QMAKE_CXXFLAGS += -g 
#QMAKE_CXXFLAGS += -g3

  在這裏插入圖片描述

  在這裏插入圖片描述

  在這裏插入圖片描述

  還試了下-g3:
  在這裏插入圖片描述

  定位了函數,不定位行號。

測試:release版本,有-g/-g3,未屏蔽qt打印輸出

  在這裏插入圖片描述

  所以,最終發現是不能屏蔽qt打印輸出的,不然是沒有的,跟release或者debug沒有關係(沒有去論證debug下屏蔽qt打印輸出了)

測試:release版本,無-g,未屏蔽qt打印輸出

  在這裏插入圖片描述

  所以,無-g也不行

模擬實戰

  先加了一句代碼:
  在這裏插入圖片描述

  取消屏蔽qt打印,加上-g:
  在這裏插入圖片描述

  使用release編譯後,運行崩潰:
  在這裏插入圖片描述

  定位coredump文件:
  在這裏插入圖片描述

  然後使用gdb的方法:
  在這裏插入圖片描述
  這裏得行是qlist.h的行號,不是我們代碼的行號,所以下標錯誤估計就這樣了。可以判斷出,越界也是最後某個地方調用指針導致錯誤,所以越界當時是不會有問題,當越界在用越界調用的就把出錯的指針調用出行數打出來。
  下面試試指針錯誤:
  在這裏插入圖片描述

 

專項測試結論

  在這裏插入圖片描述

 

入坑

入坑一:gdb不出現行數

問題

  Gdb調試不出現行數

原因

  • 原因1:release與debug問題
  • 原因2:-g問題
  • 原因3:是否屏蔽qt打印問題
      1+2+3,導致情況多種,花了不少時間定位

解決

  進行了專項測試論證,查看“專項測試論證”。

 

qBreakpad(此方法未通,貼出來參考,有興趣的讀者可以繼續往下走)

  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
  下載來:在這裏插入圖片描述

 

編譯qBreakpad庫

步驟一:下載解壓

  在這裏插入圖片描述

步驟二:複製改名依賴庫

  複製過去並改名:
  在這裏插入圖片描述

  改完後(先刪除已經存在的):
  在這裏插入圖片描述

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

  在這裏插入圖片描述

步驟四:解決錯誤“undefined reference to `google_breakpad::PEFile::TryGetDebugInfo(xxxx”,繼續編譯

  懷疑是版本問題,降低版本試試:
  在這裏插入圖片描述

  如下,下載解壓後替換:
  在這裏插入圖片描述

步驟五:解決錯誤“*** 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,所以這邊停止了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章