你是不是有這種經驗?
? 程式明明在電腦上跑沒事,一丟到嵌入式裝置上就直接 crash!
? 想除錯卻只有串口、SSH,不知道怎麼下斷點、抓變數?
這時候你需要的不是奇蹟,而是——GDB 遠端除錯(Remote Debug)!
這篇文章會教你用 GDB + gdbserver,在本機除錯遠端的 Linux 裝置或開發板,讓你從容追 Bug、精準解錯!
一、什麼是 GDB 遠端除錯?
GDB 遠端除錯是一種讓你的電腦(Client)使用 GDB,去連接目標裝置(Target)上的 gdbserver
,實現「本機控制,遠端執行」的除錯模式。
架構圖:
[主機 PC:GDB] ← TCP/IP → [開發板:gdbserver + 程式]
✅ 不用把整個開發環境搬到板子上
✅ 可以使用電腦的 GDB 環境進行單步、斷點、追蹤堆疊等操作
✅ 適合嵌入式開發、IoT 設備、ARM 系統除錯
二、環境準備
? 你需要:
-
一台開發主機(例如 Ubuntu 開發機)
-
一個目標裝置(例如 Raspberry Pi、嵌入式 Linux 板子)
-
交叉編譯器與 GDB
-
在目標裝置上安裝
gdbserver
✅ 安裝 gdbserver(在遠端板子上):
sudo apt install gdbserver
三、交叉編譯你的程式(帶除錯資訊)
在主機端使用交叉編譯器:
arm-none-eabi-gcc -g -o hello hello.c
或是針對 Linux 系統的嵌入式板子:
arm-linux-gnueabihf-gcc -g hello.c -o hello
⚠️ 一定要加入 -g
,否則你在主機上無法看到原始碼對應!
四、在目標裝置上執行 gdbserver
在板子(或遠端 Linux 裝置)上:
gdbserver :1234 ./hello
這代表 gdbserver 正在監聽 1234
port,等待本機 GDB 連線。
五、在主機上啟動 GDB 並連接遠端
在主機電腦輸入:
arm-linux-gnueabihf-gdb hello
再輸入以下指令建立連線:
(gdb) target remote <遠端IP>:1234
成功連線後,就可以像本機除錯一樣操作了!
六、常用遠端除錯指令
指令 | 功能 |
---|---|
break main |
設斷點 |
continue |
執行程式直到斷點 |
step / next |
單步執行 |
print var |
顯示變數內容 |
bt |
查看堆疊回溯(Backtrace) |
info locals |
查看區域變數 |
這些指令都在主機端 GDB 執行,不需要在目標裝置安裝任何編譯環境!
七、GDB 遠端除錯 Tips & 實戰建議
✅ 保留原始碼與符號表在主機上,否則你會看到一堆機器碼
✅ 使用 SSH、網線或 USB 串口傳送執行檔到目標裝置
✅ 可將 GDB、gdbserver 整合進你的 Makefile 或啟動腳本中
✅ 斷線後可重新用
target remote
重連,不需重啟程式
八、進階玩法:串口除錯 + 多線程除錯
你甚至可以這樣玩:
-
使用 USB 串口傳送
gdbserver
訊號 -
多執行緒程式中用
info threads
掃描執行緒 -
用
thread <n>
切換執行緒進行逐步檢查
? 這就是專業系統開發者的日常!
結語:GDB 遠端除錯讓你真正掌控嵌入式開發現場
如果你是寫 driver、IoT 應用、或嵌入式應用程式,GDB 遠端除錯會是你最可靠的救命工具。
它讓你:
-
掌握低層記憶體狀態
-
無痛追蹤遠端程式錯誤
-
一次解決無頭裝置上的 Bug 問題
評論