# 編譯時加入調試符號,關閉優化
gcc -g -O0 hello.c -o hello
# 或 C++
g++ -g -O0 main.cpp -o main
gdb ./hello # 直接載入可執行文件
gdb --args ./hello arg1 arg2 # 帶參數啟動
| 命令 | 縮寫 | 作用 |
|---|---|---|
break main | b main | 在 main 入口設置斷點 |
break 15 | b 15 | 在第 15 行設置斷點 |
break file.c:20 | 指定文件行號 | |
break func if i>10 | 條件斷點 | |
info breakpoints | i b | 查看所有斷點 |
delete 2 | d 2 | 刪除 2 號斷點 |
run | r | 開始/重新運行程序 |
next | n | 單步執行(不進入函數) |
step | s | 單步執行(進入函數) |
continue | c | 繼續運行至下一斷點 |
finish | fin | 運行至當前函數返回 |
print var | p var | 打印變量值 |
print/x var | p/x | 十六進制打印 |
display var | disp | 每次停下自動打印 |
watch var | 監視變量變化(硬件/軟件觀察點) | |
backtrace | bt | 查看調用棧 |
frame 2 | f 2 | 切換到第 2 層棧幀 |
list | l | 顯示當前行周圍源碼 |
quit | q | 退出 GDB |
#include <stdio.h>
#define N 10
int a[N] = {12,76,48,62,94,17,37,52,69,32};
void swap(int* x, int* y) { int t=*x; *x=*y; *y=t; }
int main() {
for (int i=0; ii; --j) // 原代碼 j>1 是 Bug
if (a[j] < a[j-1]) swap(&a[j], &a[j-1]);
for (int i=0; i
gcc -g -O0 bug.c -o buggdb ./bugb main → rn 單步進入外層循環p i、p j 觀察循環變量j>1 恆真,導致 j 不會隨 i 變化 → 改為 j>ictrl+x a 開啟源碼/彙編分屏,ctrl+x 1/2 切換佈局。python print(gdb.parse_and_eval("var")) 實現複雜數據結構可視化。ulimit -c unlimited → 程序崩潰產生 core → gdb ./exe core 事後調試。gdbserver :1234 ./exe,宿主機 target remote ip:1234。掌握「編譯加 -g → 斷點 → 運行 → 單步/觀察 → 修正 → 重試」閉環,配合 bt、watch、core dump 等進階手段,能解決 95% 的邏輯與崩潰類 Bug。