GDB (GNU Debugger) 是 Linux 下最強大的命令行調試器,支持 C/C++/Go/Rust 等語言。本文系統梳理四大核心功能、高頻命令速查表、實戰調試流程與進階技巧。
# 直接調試可執行文件
gdb ./program
# 調試帶參數程序
gdb --args ./program arg1 arg2
# 調試運行中進程 (需權限)
gdb -p PID
# 調試 core 文件
gdb ./program core.dump
| 類別 | 命令 | 縮寫 | 說明 |
|---|---|---|---|
| 執行控制 | run | r | 啟動程序 |
| continue | c | 繼續運行 | |
| next | n | 單步跳過函數調用 | |
| step | s | 單步進入函數 | |
| finish | fin | 運行至當前函數返回 | |
| kill | k | 終止被調試程序 | |
| 斷點管理 | break location | b | 設置斷點 (文件:行/函數名/地址) |
| tbreak | tb | 臨時斷點 (命中一次自動刪除) | |
| condition N expr | 設置條件斷點 | ||
| watch expr | 數據觀察點 (讀/寫/讀寫) | ||
| info breakpoints | i b | 列出所有斷點 | |
| delete [N] | d | 刪除斷點 | |
| 數據檢查 | print expr | p | 打印表達式值 |
| display expr | disp | 自動顯示 (每次停止自動打印) | |
| x/fmt addr | 檢查內存 (格式: x/10xw $sp) | ||
| info locals | 顯示局部變量 | ||
| info args | 顯示函數參數 | ||
| bt | 回溯棧幀 | ||
| 環境查看 | info registers | i r | 寄存器值 |
| info threads | i th | 線程列表 | |
| info signals | i si | 信號處理表 | |
| disassemble | disas | 反彙編 |
#include
using namespace std;
void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int i, j;
cout << "Enter two integers: ";
cin >> i >> j;
cout << "Before swap(), i=" << i << " j=" << j << endl;
swap(i, j);
cout << "After swap(), i=" << i << " j=" << j << endl;
return 0;
}
# 1. 編譯帶調試信息
g++ -g -o swap swap.cc
# 2. 啟動 GDB
gdb swap
# 3. 設置斷點
(gdb) break swap
Breakpoint 1 at 0x4005d6: file swap.cc, line 5.
# 4. 運行程序
(gdb) run
Starting program: /path/swap
Enter two integers: 3 5
Breakpoint 1, swap (a=3, b=5) at swap.cc:5
# 5. 檢查參數
(gdb) info args
a = 3
b = 5
# 6. 單步執行
(gdb) next
6 a = b;
(gdb) print a
$1 = 5
(gdb) next
7 b = tmp;
(gdb) print b
$2 = 3
# 7. 繼續運行
(gdb) continue
Continuing.
After swap(), i=5 j=3
[Inferior 1 (process 12345) exited normally]
(gdb) break 42 if i == 999
(gdb) condition 1 ptr != NULL
(gdb) set var flag = 1
(gdb) call func() # 調用函數
(gdb) info threads
(gdb) thread 2
(gdb) thread apply all bt # 所有線程回溯
# 系統啟用 core dump
ulimit -c unlimited
echo "/tmp/core.%e.%p" > /proc/sys/kernel/core_pattern
# 分析
gdb ./program /tmp/core.program.12345
(gdb) bt
(gdb) info registers
gdb -tui ./program
# 或 GDB 內啟動
(gdb) layout src
(gdb) layout asm
(gdb) layout regs
| 問題 | 解決 |
|---|---|
| 無調試信息 | 編譯加 -g,優化級別用 -O0 或 -Og |
| 優化導致變量優化掉 | -fno-omit-frame-pointer -O0 |
| 附加進程權限不足 | echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope |
| 共享庫符號缺失 | set solib-search-path /path/to/libs |
GDB 雖為命令行工具,但功能遠超圖形化調試器,掌握它是 Linux 開發者的必修課。