GDB 教學:安裝、常用指令與除錯技巧(附影片)
GDB 基本教學
(影片教學在文章最下方)
1. GDB 介紹
GDB(GNU Debugger)是一個強大的調試工具,可用於調試 C、C++ 及其他語言的程式。它允許你設置斷點、單步執行程式、檢查變數值、修改記憶體等。
2. 安裝 GDB
Linux(Ubuntu/Debian)
sudo apt update
sudo apt install gdb
macOS(透過 Homebrew)
brew install gdb
Windows
可透過 MinGW 或 Cygwin 來安裝 GDB。
3. 編譯程式以供 GDB 除錯
在編譯時,需要加上 -g 選項來產生除錯資訊。
gcc -g -o my_program my_program.c
4. 啟動 GDB
gdb my_program
或執行並傳遞參數:
gdb --args my_program arg1 arg2
5. GDB 常用指令
5.1 設置斷點
- 設定函式內的斷點:
break main - 設定特定行號的斷點:
break 10 - 設定特定檔案與行號的斷點:
break my_program.c:15
5.2 執行程式
- 執行程式(會停在第一個斷點):
run - 帶參數執行:
run arg1 arg2
5.3 單步執行
- 執行下一行程式碼(會進入函式內部):
step - 執行下一行程式碼(不進入函式內部):
next - 繼續執行直到遇到下一個斷點或程式結束:
continue - 執行到當前函式返回:
finish
5.4 變數與記憶體檢查
- 顯示變數值:
print x - 監視變數變化:
watch x - 列出當前函式的所有變數:
info locals
5.5 監控執行狀態
- 查看呼叫堆疊:
backtrace - 切換堆疊幀(frame):
frame 2
5.6 修改變數值
- 變更變數內容:
set var x = 10
5.7 移除斷點
- 列出所有斷點:
info breakpoints - 刪除特定斷點(例如刪除 1 號斷點):
delete 1
5.8 退出 GDB
- 退出除錯模式:
quit
6. GDB 進階功能
6.1 記錄程式執行
- 使用
record指令記錄程式執行過程:record - 反向執行(撤銷一步):
reverse-step - 反向繼續執行:
reverse-continue
6.2 追蹤記憶體
- 檢查記憶體地址:
x/10xw 0x601040 - 檢視指標指向的內容:
print *ptr
螢幕錄影版本
簡報版本
讓 GDB 更好用的外掛
原生 GDB 的畫面比較陽春,做逆向或 Pwn 時常會搭配外掛,自動顯示暫存器、堆疊與反組譯:
- pwndbg:CTF 與漏洞利用最常用,指令豐富
- GEF:單一檔案、安裝簡單,支援多種架構
- PEDA:較早期的經典外掛,目前較少更新
常見問題
為什麼 GDB 看不到原始碼與變數名稱?
編譯時沒有加 -g 參數,執行檔就不含除錯資訊。重新用 gcc -g 編譯即可。
macOS 上的 GDB 為什麼無法執行程式?
macOS 需要替 GDB 進行程式碼簽章才能附加到程序上,設定較繁瑣;Apple Silicon 機型建議改用內建的 LLDB,或在 Linux 虛擬機中使用 GDB。
