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 執行程式,直到當前函式完成返回。並列印函式返回時的堆疊地址和返回值及引數值資訊。