首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GDB 調試 C 程序入門:6 步掌握斷點、單步、變量查看與棧回溯

     編輯:關於C語言

準備:帶調試信息編譯


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. 單步執行控制

命令縮寫行為
continuec運行到下一斷點/程序結束
nextn單步下一行(**不進入**函數)
steps單步下一行(**進入**函數內部)
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;
}
  1. break 7 (循環行) → run → p j 發現垃圾值 → 修復 int j = 1;。
  2. 重新編譯運行 → 結果仍錯 → 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 體驗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved