Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux GDB 調試器完全指南:核心功能、命令速查與實戰案例

編輯:關於 Linux

GDB (GNU Debugger) 是 Linux 下最強大的命令行調試器,支持 C/C++/Go/Rust 等語言。本文系統梳理四大核心功能、高頻命令速查表、實戰調試流程與進階技巧。

四大核心功能

  1. 程序啟動控制:參數傳遞、環境變量、工作目錄、調度策略
  2. 斷點管理:行/函數/條件/數據/臨時斷點、忽略次數、命令腳本
  3. 運行時檢查:變量值、寄存器、內存、棧幀、線程、信號
  4. 動態環境修改:修改變量、調用函數、改變執行流、信號注入

啟動方式

# 直接調試可執行文件
gdb ./program

# 調試帶參數程序
gdb --args ./program arg1 arg2

# 調試運行中進程 (需權限)
gdb -p PID

# 調試 core 文件
gdb ./program core.dump

高頻命令速查表

類別命令縮寫說明
執行控制runr啟動程序
continuec繼續運行
nextn單步跳過函數調用
steps單步進入函數
finishfin運行至當前函數返回
killk終止被調試程序
斷點管理break locationb設置斷點 (文件:行/函數名/地址)
tbreaktb臨時斷點 (命中一次自動刪除)
condition N expr設置條件斷點
watch expr數據觀察點 (讀/寫/讀寫)
info breakpointsi b列出所有斷點
delete [N]d刪除斷點
數據檢查print exprp打印表達式值
display exprdisp自動顯示 (每次停止自動打印)
x/fmt addr檢查內存 (格式: x/10xw $sp)
info locals顯示局部變量
info args顯示函數參數
bt回溯棧幀
環境查看info registersi r寄存器值
info threadsi th線程列表
info signalsi si信號處理表
disassembledisas反彙編

實戰案例:調試交換函數

源碼 (swap.cc)

#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

TUI 文本界面模式

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 開發者的必修課。

Copyright © Windows教程網 All Rights Reserved