準備:帶調試信息編譯
gcc -g factorial.c -o factorial
# -g 嵌入 DWARF 調試信息,包含行號、變量名、類型
啟動 GDB
gdb ./factorial
# 進入 (gdb) 提示符
6 步調試流程
1. 設置斷點
(gdb) break 10 # 第 10 行
(gdb) break factorial.c:10 # 文件:行
(gdb) break main # 函數入口
(gdb) info breakpoints # 查看所有斷點
2. 運行程序
(gdb) run # 開始執行,停在首個斷點
(gdb) run arg1 arg2 # 帶參數運行
3. 查看變量值
(gdb) print i # 打印變量 i
(gdb) p j # 簡寫 p
(gdb) p/x val # 十六進制
(gdb) p/t val # 二進制
(gdb) display i # 每次停下自動打印 i
4. 單步執行控制
| 命令 | 縮寫 | 行為 |
| continue | c | 運行到下一斷點/程序結束 |
| next | n | 單步下一行(**不進入**函數) |
| step | s | 單步下一行(**進入**函數內部) |
| finish | | 運行完當前函數返回 |
| until 20 | | 運行到第 20 行 |
5. 檢查調用棧
(gdb) backtrace # 完整棧回溯
(gdb) bt # 縮寫
(gdb) frame 2 # 切換到第 2 幀
(gdb) info locals # 當前幀局部變量
(gdb) info args # 當前幀參數
6. 查看源代碼
(gdb) list # 顯示當前行前後 10 行
(gdb) l 20 # 顯示第 20 行附近
(gdb) l main # 顯示 main 函數
實戰案例:修復階乘程序兩個 Bug
/* factorial.c */
#include
int main() {
int i, num, j; // Bug1: j 未初始化
printf("Enter number: ");
scanf("%d", &num);
for (i = 1; i < num; i++) // Bug2: 條件應為 i <= num
j = j * i;
printf("Factorial of %d is %d\n", num, j);
return 0;
}
break 7 (循環行) → run → p j 發現垃圾值 → 修復 int j = 1;。
- 重新編譯運行 → 結果仍錯 →
n 單步觀察 i 變化 → 發現循環少跑一次 → 修復 i <= num。
常用快捷鍵與技巧
- Enter** 重複上一條命令(單步神器)。
set args ... 動態修改運行參數。
watch expr 數據觀察點(變量寫入時中斷)。
set var x = 10 運行時修改變量。
call func() 執行函數並打印返回值。
quit / q 退出 GDB。
圖形界面替代
gdb -tui:終端分屏顯示源碼/彙編/寄存器。
cgdb / gdbgui / VS Code + C++ 插件:現代 IDE 體驗。