20231302-邱之釗-gdb調試
邱之釗同學,你好!
今天我們來學習一個非常重要的開發工具——gdb調試器。作為未來要在國產化操作系統上工作的開發者,掌握調試技能對你特別關鍵。我注意到你基礎一般,沒關系,調試本身就是從不斷犯錯中學習的藝術,我會帶著你一步步掌握。
我們先在openEuler系統上創建一個測試文件。打開終端,輸入:
vim testgdb.c

然后輸入以下代碼(我特意設計了函數調用和循環結構來練習調試):
#include <stdio.h>
int calculate(int n) {
int sum = 0;
for(int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
int main() {
int result = calculate(5);
printf("1+2+3+4+5 = %d
", result);
for(int i = 0; i < 3; i++) {
printf("循環次數: %d
", i);
}
return 0;
}

編譯時記得加上 -g 參數,這樣gdb才能顯示調試信息:
gcc -g testgdb.c -o testgdb
現在開始調試之旅。首先啟動gdb:
gdb ./testgdb
你會看到gdb的提示符 (gdb),接下來我們逐個學習核心命令:
-
help - 查看幫助
輸入 help 可以看到所有命令分類,help breakpoints 專門查看斷點幫助 -
run - 啟動程序
輸入 run 程序會完整執行一遍。但我們現在要調試,所以需要先設置斷點 -
break - 設置斷點(4種類型演示)
break main # 函數斷點:在main函數入口暫停
break testgdb.c:10 # 行斷點:在源文件第10行暫停
tbreak 15 # 臨時斷點:第15行暫停一次后自動刪除
break 7 if i == 3 # 條件斷點:當變量i等于3時暫停
-
continue - 繼續執行
設置斷點后輸入 run,程序會在斷點處暫停。輸入 continue 會繼續執行到下一個斷點 -
next 和 step - 單步執行
next # 執行下一行代碼(不進入函數內部)
step # 執行下一行代碼(會進入函數內部)
6. until - 快速跳出循環
當你在循環體內時,輸入 until 會直接執行完當前循環
-
finish - 執行完當前函數
在函數內部時,輸入 finish 會執行完當前函數并暫停在返回處 -
print - 查看變量值
print sum # 查看sum變量的值
print &result # 查看result變量的地址
- display - 自動顯示變量
display i # 每次暫停時自動顯示i的值
display sum # 每次暫停時自動顯示sum的值
現在讓我們實際操作一遍。在gdb中依次輸入:
break main
run
next
step
display i
display sum
continue

記住調試的核心邏輯:設置斷點 → 運行 → 查看變量 → 單步跟蹤 → 發現問題。就像偵探破案一樣,在每個關鍵位置設置"監控點"(斷點),觀察變量的變化過程。
你可能會問為什么需要這么多命令?因為調試不同場景需要不同工具:next 用于快速跳過已知正常的函數,step 用于深入可疑函數內部,until 幫我們避免在循環中一次次next。
在實際開發中,90%的bug都是通過設置 strategic breakpoints(戰略斷點) 找到的。比如在國產化系統開發中,遇到硬件相關問題時,往往需要在關鍵接口函數設置斷點,然后查看參數傳遞是否正確。
建議你今天按照這個流程練習3遍:1)編譯帶調試信息的程序 2)設置4種斷點 3)使用單步命令 4)觀察變量變化。動手實操是最好的學習方法,遇到問題隨時記錄下來,下次我們可以重點討論。
以下是設置的四種斷點:
條件斷點:

臨時斷點:

行斷點:

函數斷點:

作業提交要求 (1')
拷貝出AI生成的所有內容,把你實踐編譯和測試過程截圖插入,AI生成內容不滿意,可以刷新一下,代碼可能不能直接使用,需要你做簡單修改
(選做)推薦所有作業托管到 gitee或 github 上
(必做)提交作業 markdown文檔,命名為“學號-姓名-作業題目.md”
(必做)提交作業 markdown文檔轉成的 PDF 文件,命名為“學號-姓名-作業題目.pdf”
浙公網安備 33010602011771號