想要用gdb對openwrt進行遠端調試。首先得在openwrt目标機上安裝gdbserver。
其實在trunk路徑下也有gdb的ipk安裝包的,不信find一下。
檢視一下它們的大小:
omg,gdb這個包有1.5m!對于flash總共才隻有8m的路由器,實在有點吃緊!
還好,gdbserver隻有96k。我們可以将gdbserver安裝在目标機上,将其用網絡或序列槽與開發機上的gdb進行協同使用。
gdbserver 可以用 ipk 包進行安裝。
在openwrt的trunk目錄下,運作 make menuconfig,進行系統進行裁剪。
gdbserver在 development 目錄下。
将gdbserver選為m,儲存退出。
可以打開 .config 進行檢視:
可以看到 config_package_gdbserver=m。
好了,再 make v=s 。
編譯完成之後,生成 bin/ar71xx/packages/base/gdbserver_7.8-1_ar71xx.ipk 封包件。
将這個檔案用 scp 傳送到目标機上,進行安裝。
依賴 libthread-db 庫。那就先安裝 libthread 。安裝包是:
trunk/bin/ar71xx/packages/base/libthread-db_0.9.33.2-1_ar71xx.ipk
将其傳到目标機上并安裝。
然後再安裝 gdb-server:
好了!安裝好了,那就用用看吧。
遠端調試需要目标機啟動 gdbserver并執行調試目标程式。在調試的過程中,gdbserver開啟一個tcp服務,由開發機上的gdb連接配接。之後 gdbserver接收gdb的指令并将指令操作結果回報給gdb,進而達到了遠端調試的目的。
開發機(centos)ip:192.168.1.10
目标機(openwrt)ip:192.168.1.2
在目标機上啟動gdbserver
如上,指令格式為:gdbserver <local ip>:<port> <program> [args list]
<local ip>就寫成127.0.0.1,<port>指定為3000,要調試的是debug-demo程式。
如下為程式源碼:
src/main.c
src/makefile:
值得注意的是:在 src/makefile中,添加一行:
使之在make的時候能夠将調試資訊加進去。
然後,在開發機上啟動gdb,并執行 target remote 192.168.1.2:3000 進行連接配接:
出現問題:(1)首先gdb不認識mips平台。(2)沒有xml目标描述檔案。
應該說,什麼樣的平台就應該用什麼樣的gdb進行調試。如果像上面那樣,用開發機的 gdb 與目标機上的 gdbserver 連接配接進行調試,應該是不對的。
那麼應該使用 mips 平台的gdb。而這個gdb就在 staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uclibc-0.9.33.2/bin/ 路徑下,有一個:mips-openwrt-linux-gdb 檔案。
運作它來進行調試:
可以看到,gdb在啟動時提示:"this gdb was configured as "--host=i686-redhat-linux --target=mips-openwrt-linux-uclibc",說明該gdb是針對mips平台的。
這裡,部落客要總結一下。gdb有三種:
安裝到目标機上,在目标機上運作的gdb。(通過ssh在目标機上運作gdb調試)
運作在開發機上,用于調試目标機上程式的。(通過ssh在目标機上運作gdbserver開啟調試服務,在開發機上啟動平台對應的gdb連接配接gdbserver進行調試)
運作在開發機上,用于調試開發機程式的。
這3種gdb不能搞混淆了。
好,再連接配接目标機:
結果還是報沒有xml目标描述檔案。
具這位大牛說,是在編譯gdb的時候,沒有xml的解析庫expat。
那我就在開發機上看一下有沒有這個庫。用locate查一下:
說明開發機系統是有expat庫的。
那為什麼沒有編譯進去呢?有可能是在編譯 gdb 的 ./configure 時候,将expat去除了。
檢視trunk路徑下,關于gdb包的makefile。打開檔案:package/devel/gdb/makefile,發現:
嘿!第56行,看到了嗎?禁了expat。為什麼要禁它???
部落客也就嘗試一下,把第56行删除。改成:
重新make gdb。
思考一下:你說,這是編譯目标機上在gdb呢,還是開發機上的gdb?
實踐證明,我想錯了。在package目錄下都是要打包成ipk的。
因為上面的make指令并沒有影響到:staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uclibc-0.9.33.2/bin/mips-openwrt-linux-gdb
而是:bin/ar71xx/packages/base/gdb_7.8-1_ar71xx.ipk
應該是在 toolchain 目錄下的才是。
<未完待續>