麒麟系統開發筆記(十一):在國產麒麟系統上使用gdb定位崩潰異常方法流程進階定位代

21497936發表於2023-03-31

前言

  上一篇,透過研究,可以定位到函式,本篇進一步最佳化,沒有行數,程式較為複雜的時候,就無法定位,所以進一步定位。
  本篇做了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_OUTPUTQMAKE_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下載地址:

git clone --recursive .git

  好像下下來有點問題,最後還是手動下載zip包了:
   在這裡插入圖片描述

  qBreakpad依賴breakpad和lss
    在這裡插入圖片描述

  下不下來,另外找把

  breakpad下載地址:

  (最新版報錯),下載v2021.08.09版本

   在這裡插入圖片描述

  lss:
  下載來: 在這裡插入圖片描述

編譯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,所以這邊停止了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2942857/,如需轉載,請註明出處,否則將追究法律責任。

相關文章