GDB - 除錯程式



入門:啟動和停止

  • gcc -g myprogram.c

    • 使用除錯選項 (-g) 編譯 myprogram.c。你仍然會得到一個 a.out 檔案,但它包含除錯資訊,允許你在 GDB 中使用變數和函式名稱,而不是原始記憶體位置(不好玩)。

  • gdb a.out

    • 使用檔案 a.out 開啟 GDB,但不執行程式。你會看到一個提示符 (gdb) - 所有示例都來自此提示符。

  • r

  • r arg1 arg2

  • r < file1

    • 三種執行先前載入的“a.out”的方法。你可以直接執行它 (r),傳遞引數 (r arg1 arg2),或輸入檔案。你通常會在執行之前設定斷點。

  • help

  • h breakpoints

    • 列出幫助主題 (help) 或獲取有關特定主題的幫助 (h breakpoints)。GDB 文件齊全。

  • q - 退出 GDB

單步執行程式碼

單步執行允許你跟蹤程式的路徑,並聚焦於導致崩潰或返回無效輸入的程式碼。

  • l

  • l 50

  • l myfunction

    • 列出當前行 (l) 的 10 行原始碼、特定行 (l 50) 的原始碼或函式 (l myfunction) 的原始碼。

  • next

    • 執行程式直到下一行,然後暫停。如果當前行是函式,它將執行整個函式,然後暫停。next 適用於快速遍歷程式碼。

  • step

    • 執行下一條指令,而不是下一行。如果當前指令正在設定變數,則它與next相同。如果它是一個函式,它將跳轉到該函式,執行第一條語句,然後暫停。step 適用於深入瞭解程式碼細節。

  • finish

    • 完成當前函式的執行,然後暫停(也稱為步出)。如果你不小心步入了一個函式,這很有用。

斷點或觀察點

斷點在除錯中起著重要作用。當程式到達某個點時,它們會暫停(中斷)程式。你可以檢查和更改變數並恢復執行。當某些輸入失敗發生或需要測試輸入時,這很有幫助。

  • break 45

  • break myfunction

    • 在第 45 行或 myfunction 處設定斷點。程式到達斷點時將暫停。
  • watch x == 3

    • 設定觀察點,當條件更改時(當 x == 3 更改時)暫停程式。觀察點非常適合某些輸入(myPtr != NULL),而無需在每個函式呼叫上中斷。

  • continue

    • 在斷點/觀察點暫停後恢復執行。程式將繼續執行,直到遇到下一個斷點/觀察點。

  • delete N

    • 刪除斷點 N(建立時會對斷點進行編號)。

設定變數

在執行時檢視和更改變數是除錯的關鍵部分。嘗試向函式提供無效輸入或執行其他測試用例以查詢問題的根本原因。通常,你將在程式暫停時檢視/設定變數。

  • print x

    • 列印變數 x 的當前值。能夠使用原始變數名稱是需要 (-g) 標誌的原因;常規編譯的程式已刪除此資訊。

  • set x = 3

  • set x = y

    • 將 x 設定為一個設定值 (3) 或另一個變數 (y)
  • call myfunction()

  • call myotherfunction(x)

  • call strlen(mystring)

    • 呼叫使用者定義或系統函式。這非常有用,但要注意呼叫有錯誤的函式。

  • display x

    • 持續顯示變數 x 的值,該值在每次步驟或暫停後顯示。如果你不斷檢查某個值,這很有用。

  • undisplay x

    • 刪除 display 命令顯示的變數的持續顯示。

回溯和更改幀

棧是當前函式呼叫的列表 - 它顯示你在程式中的位置。儲存單個函式呼叫的詳細資訊,例如引數。

  • bt

    • 回溯或列印當前函式棧以顯示你在當前程式中的位置。如果 main 呼叫函式 a(),a() 呼叫 b(),b() 呼叫 c(),則回溯為

  • c <= current location 
    b 
    a 
    main 
    
  • up

  • down

    • 在函式棧中向上或向下移動到下一幀。如果你在c中,你可以移動到ba以檢查區域性變數。

  • return

    • 從當前函式返回。

處理訊號

訊號是在某些事件(例如計時器或錯誤)之後丟擲的訊息。GDB 可能會在遇到訊號時暫停;你可能希望改為忽略它們。

  • handle [signalname] [action]

  • handle SIGUSR1 nostop

  • handle SIGUSR1 noprint

  • handle SIGUSR1 ignore

    • 指示 GDB 在發生時忽略某個訊號 (SIGUSR1)。有不同級別的忽略。

廣告