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

GDB 快速上手:從編譯到斷點調試的完整工作流

     編輯:關於C語言

準備工作

# 編譯時加入調試符號,關閉優化
gcc -g -O0 hello.c -o hello
# 或 C++
g++ -g -O0 main.cpp -o main

啟動 GDB

gdb ./hello           # 直接載入可執行文件
gdb --args ./hello arg1 arg2  # 帶參數啟動

核心命令速查表

命令縮寫作用
break mainb main在 main 入口設置斷點
break 15b 15在第 15 行設置斷點
break file.c:20指定文件行號
break func if i>10條件斷點
info breakpointsi b查看所有斷點
delete 2d 2刪除 2 號斷點
runr開始/重新運行程序
nextn單步執行(不進入函數)
steps單步執行(進入函數)
continuec繼續運行至下一斷點
finishfin運行至當前函數返回
print varp var打印變量值
print/x varp/x十六進制打印
display vardisp每次停下自動打印
watch var監視變量變化(硬件/軟件觀察點)
backtracebt查看調用棧
frame 2f 2切換到第 2 層棧幀
listl顯示當前行周圍源碼
quitq退出 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

調試步驟

  1. gcc -g -O0 bug.c -o bug
  2. gdb ./bug
  3. b main → r
  4. n 單步進入外層循環
  5. p i、p j 觀察循環變量
  6. 發現內層循環條件 j>1 恆真,導致 j 不會隨 i 變化 → 改為 j>i
  7. 重新編譯驗證輸出有序。

進階技巧

  • TUI 模式:ctrl+x a 開啟源碼/彙編分屏,ctrl+x 1/2 切換佈局。
  • Python 腳本: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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved