GDB程式碼除錯與使用

20145216史婧瑤發表於2016-12-04

GDB程式碼除錯與使用

Linux下GDB除錯程式碼

原始碼

編譯生成執行檔案

gcc -g test.c -o test

使用GDB除錯

  • 啟動GDB:gdb test

  • 從第一行列出原始碼:list

  • 直接回車表示,重複上一次命令

  • 設定斷點,在源程式16行處:break 16

  • 設定斷點,在函式func()入口處:break func

  • 檢視斷點資訊:info break

  • 執行程式:run

  • 在斷點處停住
  • 單條語句執行:next

  • 繼續執行程式:continue【程式輸出:result[1-100]=5050】

  • 列印變數i的值:print i

  • 列印變數sum的值:p sum

  • 檢視函式堆疊:bt

  • 推出函式:finish

  • 繼續執行程式:continue【程式輸出:result[1-250]=31125;程式退出,除錯結束:Inferior 1 (process 4040) exited normally】

  • 退出GDB:quit

使用GDB

啟動GDB

  • gdb [program] program也就是你的執行檔案,一般在當前目錄下。

  • gdb [program] core 用gdb同時除錯一個執行程式core檔案,core是程式非法執行後core dump後產生的檔案。

  • gdb [program] [PID] 如果你的程式是一個服務程式,那麼你可以指定這個服務程式執行是的程式ID。gdb會自動attach上去,並除錯它。program應該在PATH環境變數中搜尋到。

GDB的命令概貌

  • 啟動GDB後,就進入了GDB的除錯環境,就可以使用GDB的命令開始除錯程式了,GDB的命令可以使用help命令來檢視:

  • GDB的命令很多,GDB把之分成很多種類。help命令只是列出了GDB的命令種類,如果要看種類中的命令,使用help [class]命令,如:help breakpoints,檢視設定斷點的所有命令。也可以直接help [command]來檢視命令的幫助。

  • GDB中,輸入命令時,可以不用打全命令,只用打命令的前幾個字元就可以了,當然,命令的前幾個字元要標誌著一個唯一的命令,在linux下,可以敲擊兩次TAB鍵來補齊命令的全稱,如果有重複的,GDB會把其列出來。

    • 示例一:在進入函式func時,設定一個斷點。可以敲擊break func,或者直接就是b func
    • 示例二:敲入b按兩次TAB鍵,你會看到所有b開頭的命令:
    • 示例三:只記得函式的字首,可以這樣:(gdb)b make_<按TAB鍵>,GDB把所有make開頭的函式全部列出來給你檢視。

退出GDB

  • 使用quit命令或者q命令。

在GDB中執行程式

  • 當以gdb [program]方式啟動GDB後,GDB會在PATH路徑和當前目錄中所搜[program]的原始檔。如要確認GDB是否讀到原始檔,可使用l或者list命令,看GDB是否能列出原始碼。

  • 在gdb中,執行程式使用r或者run命令。

除錯已執行的程式

  • 在UNIX下用ps檢視正在執行的程式的PID(程式ID),然後用gdb [program] PID格式掛接正在執行的程式。

  • 先用gdb [program]關聯上原始碼,並進行GDB,在GDB中用attach命令來掛接程式的PID,並用detach來取消掛接的程式。

暫停程式執行

  • 除錯程式中,暫停程式執行時必須的,GDB可以方便的暫停程式的執行。你可以設定程式在哪停住,在什麼條件下停住,在收到什麼訊號時停住等等。你便於你檢視執行的變數,以及執行時的流程。

  • 當程式被GDB停住時,你可以使用infoprogram來檢視程式是否在執行、程式號、被暫停的原因。

  • 在GDB中,我們可以有以下幾種暫停方式:斷點(breakpoint)、觀察點(watchpoint)、捕捉點(catchpoint)、訊號(signals)、執行緒停止(threadstops)。如果要恢復程式執行,可以使用c或者continue命令。

    設定斷點(breakpoint)
    我們用break命令設定斷點。下面有幾點設定斷點的方法:
    break [function] 在進入指定函式時停住;
    break [linenum] 在指定行號停住;
    breakfilename:linenum 在原始檔filename的linenum行處停住;
    breakfilename:function 在原始檔filename的function函式的入口處停住;
    break break命令沒有引數時,表示在下一條指令處停住;
    break…if<condition> …可以是上述的引數,condition表示條件,在條件成立時停住。比如在迴圈體中,可
    以設定break if i=100,表示當i為100時停住程式。
    
  • 檢視斷點時,可使用命令info命令,如下所示:(注:n表示斷點號)

    • info breakpoints [n]
    • info break [n]

恢復程式執行

  • 當程式被停住後,可以用continue命令恢復程式的執行直到程式結束,或下一個斷點的到來。也可以使用step或next命令單步跟蹤程式。

    • continue [ignore-count]
    • c [ignore-count]
    • fg [ignore-count] 恢復程式執行,直到程式結束,或是下一個斷點到來。Ignore-count表示忽略其後的斷點次數。continue,c,fg三個命令都是一樣的意思。
    • step [count] 單步跟蹤,如果有函式呼叫,它會進入該函式。
    • next [count] 同樣單步跟蹤,如果有函式呼叫,它不會進入函式。
    • finish 執行程式,直到當前函式完成返回。並列印函式返回時的堆疊地址和返回值及引數值資訊。

相關文章