首頁 > 軟體

GDB 偵錯工具使用方法詳解

2020-06-16 16:56:01

GDB 偵錯工具使用方法詳解

1. 什麼是gdb

gdb是GNU debugger的縮寫,是程式設計偵錯工具。

2. gdb的功能

  • 啟動程式,可以按照使用者自定義的要求隨心所欲的執行程式。
  • 可讓被偵錯的程式在使用者所指定的偵錯斷點處停住(斷點可以是條件表示式)。
  • 當程式停住時,可以檢查此時程式中所發生的事。比如,可以列印變數的值。
  • 動態改變變數程式的執行環境。

3. gdb的使用

  1. 執行程式
    • run(r)執行程式,如果要加引數,則是run arg1 arg2 ...
  2. 檢視原始碼
    • list(l):檢視最近十行原始碼
    • list fun:檢視fun函數原始碼
    • list file:fun:檢視flie檔案中的fun函數原始碼
  3. 設定斷點與觀察斷點
    • break 行號/fun設定斷點。
    • break file:行號/fun設定斷點。
    • break if<condition>:條件成立時程式停住。
    • info break(縮寫:i b):檢視斷點。
    • watch expr:一旦expr值發生改變,程式停住。
    • delete n:刪除斷點。
  4. 單步偵錯
    • continue(c):執行至下一個斷點。
    • step(s):單步跟蹤,進入函數,類似於VC中的step in
    • next(n):單步跟蹤,不進入函數,類似於VC中的step out
    • finish:執行程式,知道當前函數完成返回,並列印函數返回時的堆疊地址和返回值及引數值等資訊。
    • until:當厭倦了在一個迴圈體內單步跟蹤時,這個命令可以執行程式知道退出迴圈體。
  5. 檢視執行時資料
    • print(p):檢視執行時的變數以及表示式。
    • ptype:檢視型別。
    • print array:列印陣列所有元素。
    • print *array@len:檢視動態記憶體。len是檢視陣列array的元素個數。
    • print x=5:改變執行時資料。

4. 程式錯誤

  • 編譯錯:編寫程式的時候沒有符合語言規範導致編譯錯誤。比如:語法錯誤。
  • 執行時錯誤:編譯器檢查不出這種錯誤,但在執行時候可能會導致程式崩潰。比如:記憶體地址非法存取。
  • 邏輯錯誤:編譯和執行都很順利,但是程式沒有干我們期望幹的事情。

5. gdb偵錯段錯誤

什麼是段錯誤?段錯誤是由於存取非法地址而產生的錯誤。

  • 存取系統資料區,尤其是往系統保護的記憶體地址寫資料。比如:存取地址為0的地址。
  • 記憶體越界(陣列越界,變數型別不一致等)存取到不屬於當前程式的記憶體區域。

gdb偵錯段錯誤,可以直接執行程式,當程式執行崩潰後,gdb會列印執行的資訊,比如:收到了SIGSEGV信號,然後可以使用bt命令,列印棧回溯資訊,然後根據程式發生錯誤的程式碼,修改程式。

6. core檔案偵錯

6.1 core檔案

在程式崩潰時,一般會生成一個檔案叫core檔案。core檔案記錄的是程式崩潰時的記憶體映像,並加入偵錯資訊,core檔案生成過程叫做core dump(核心已轉儲)。系統預設不會生成該檔案。

6.2 設定生成core檔案

  • ulimit -c:檢視core-dump狀態。
  • ulimit -c xxxx:設定core檔案的大小。
  • ulimit -c unlimited:core檔案無限制大小。

6.3 gdb偵錯core檔案

當設定完ulimit -c xxxx後,再次執行程式發生段錯誤,此時就會生成一個core檔案,使用gdb core偵錯core檔案,使用bt命令列印棧回溯資訊。

強大的C/C++ 程式偵錯工具GDB  http://www.linuxidc.com/Linux/2016-09/135171.htm

Linux GDB偵錯 詳述 http://www.linuxidc.com/Linux/2016-11/137505.htm

GDB偵錯命令  http://www.linuxidc.com/Linux/2017-01/139028.htm

使用GDB命令列偵錯程式偵錯C/C++程式 http://www.linuxidc.com/Linux/2014-11/109845.htm

GDB偵錯命令總結  http://www.linuxidc.com/Linux/2016-08/133988.htm

GDB偵錯工具入門  http://www.linuxidc.com/Linux/2016-09/135168.htm


IT145.com E-mail:sddin#qq.com