適用於調試已在後台運行的程序(如服務端、守護進程)。
# 1. 編譯帶調試信息的程序 gcc -g -o test_attach test_attach.c # 2. 後台運行 ./test_attach & # 輸出: [1] 2901 # 3. 查找 PID ps aux | grep test_attach # 4. GDB 附加 gdb (gdb) attach 2901 Attaching to process 2901... (gdb) bt #0 __kernel_vsyscall () #1 nanosleep () #2 sleep () #3 main () at test_attach.c:19 # 5. 查看進程信息 (gdb) info proc process 2901 cmdline = './test_attach' cwd = '/home/user' exe = '/home/user/test_attach' # 6. 分離 (gdb) detach Detaching from program: /home/user/test_attach, process 2901
ptrace 限制)。continue 恢復運行。-g。僅在滿足條件時觸發,避免在循環中手動 continue 成百上千次。
(gdb) break 行號 if 條件 (gdb) break 28 if k==100 Breakpoint 1 at 0x80483a5: file test.c, line 28. # 為現有斷點添加條件 (gdb) condition 斷點編號 條件 (gdb) condition 1 i > 50
(gdb) ignore 斷點編號 次數 (gdb) ignore 1 100 # 前100次不停
(gdb) continue 次數 (gdb) step 次數 (gdb) next 次數 (gdb) finish # 執行完當前函數 (gdb) until 行號 # 執行到指定行(跳出循環常用)
| 命令 | 說明 |
|---|---|
clear | 按位置刪除(行號、函數名、文件:行) |
delete [breakpoints] [編號] | 按編號刪除,無參數刪除所有 |
disable [breakpoints] [編號] | 禁用斷點,保留定義 |
enable [breakpoints] [編號] | 啟用斷點 |
enable once 編號 | 啟用一次,觸發後自動禁用 |
enable delete 編號 | 啟用一次,觸發後自動刪除 |
斷點觸發時自動執行一組命令,實現自動化調試。
(gdb) break 28 if k==100 (gdb) commands 1 > p k > bt > continue > end (gdb) run # 當 k==100 時自動打印 k、棧回溯並繼續運行
| 命令 | 縮寫 | 說明 |
|---|---|---|
| backtrace | bt, where | 顯示棧回溯 |
| break | b | 設置斷點 |
| continue | c | 繼續運行 |
| delete | d | 刪除斷點 |
| finish | - | 運行到函數返回 |
| info breakpoints | info b | 顯示斷點信息 |
| next | n | 單步(不進入函數) |
| p | 打印表達式 | |
| run | r | 啟動程序 |
| step | s | 單步(進入函數) |
| until | u | 運行到指定行 |