1. 程式人生 > >linux下gdb偵錯程式使用學習-03

linux下gdb偵錯程式使用學習-03

目錄

程序除錯命令

  1. attach process-id/detach[附加/分離程序]

    • attach process-id: 在GDB狀態下,開始除錯一個正在執行的程序,其程序ID為process-id
    • detach: 停止除錯當前正在除錯有程序,與attach配對試用
  2. kill

    • 基本功能:殺掉當前GDB正在除錯的應用程式所對應的子程序
    • 如果想不退出GDB而對當前正在除錯的應用程式重新編譯、連結,可以在GDB中執行kill殺掉子程序,等編譯、連結完後,再重新執行run,GDB便可載入新的可執行程式啟動除錯
  3. 多執行緒程式除錯相關:

    • thread threadno:切換當前執行緒到由threadno指定的執行緒
    • info threads:檢視GDB當前除錯的程式的各個執行緒的相關資訊
    • thread apply [threadno] [all] args:對指定(或所有)的執行緒執行由args指定的命令
  4. 多程序程式除錯相關(fork/vfork):

    • 預設方式:fork/vfork之後,GDB仍然除錯父程序,與子程序不相關
    • set follow-fork-mode mode:設定GDB行為,mode為parent時,與預設情況一樣;mode為child時,fork/vfork之後,GDB進入子程序除錯,與父程序不再相關
    • show follow-fork-mode:檢視當前GDB多程序跟蹤模式的設定
  5. step & stepi

    • step [count]: 如果沒有指定count, 則繼續執行程式,直到到達與當前原始檔不同的原始檔中時停止;如果指定了count, 則重複行上面的過程count次
    • stepi [count]: 如果沒有指定count, 繼續執行下一條機器指令,然後停止;如果指定了count,則重複上面的過程count次
    • step比較常見的應用場景:在函式func被呼叫的某行程式碼處設定斷點,等程式在斷點處停下來後,可以用step命令進入該函式的實現中,但前提是該函式編譯的時候把除錯資訊也編譯進去了,負責step會跳過該函式。
  6. next & nexti

    • next [count]: 如果沒有指定count, 單步執行下一行程式;如果指定了count,單步執行接下來的count行程式
    • nexti [count]: 如果沒有指定count, 單步執行下一條指令;如果指定了count, 音訊執行接下來的count條執行
    • stepi和nexti的區別:nexti在執行某機器指令時,如果該指令是函式呼叫,那麼程式執行直到該函式呼叫結束時才停止。
  7. continue [ignore-count] 喚醒程式,繼續執行,至到遇到下一個斷點,或者程式結束。如果指定ignore-count,那麼程式在接下來的執行中,忽略ignore-count次斷點。

  8. finish & return

    • finish: 繼續執行程式,直到當前被呼叫的函式結束,如果該函式有返回值,把返回值也列印到控制檯
    • return [expression]: 中止當前函式的呼叫,如果指定了expression,把expresson值當做當前函式的返回值;如果沒有,直接結束當前函式呼叫
  9. 訊號的處理

    • info signals & info handle:列印所有的訊號相關的資訊,以及GDB預設的處理方式:
    • handle signal action: 設定GDB對具體某個訊號的處理方式。signal可以為訊號整數值,也可以為SIGSEGV這樣的符號。action的取值有:
    • stop和nostop: nostop表示當GDB收到指定的訊號,不會應用停止程式的執行,只會打印出一條收到訊號的訊息,因此,nostop也暗含了下面的print; 而stop則表示,當GDB收到指定的訊號,停止應用程式的執行。
    • print和noprint: print表示如果收到指定的訊號,打印出一條資訊; noprint與print表示相反的意思
    • pass和nopass:pass表示如果收到指定的訊號,把該訊號通知給應用程式; nopass表示與pass相反的意思
    • ignore和noignore: ignore與nopass同義,同理,noignore與pass同義