天天看點

OpenWRT開發之——遠端debug

想要用gdb對openwrt進行遠端調試。首先得在openwrt目标機上安裝gdbserver。

其實在trunk路徑下也有gdb的ipk安裝包的,不信find一下。

檢視一下它們的大小:

omg,gdb這個包有1.5m!對于flash總共才隻有8m的路由器,實在有點吃緊!

還好,gdbserver隻有96k。我們可以将gdbserver安裝在目标機上,将其用網絡或序列槽與開發機上的gdb進行協同使用。

gdbserver 可以用 ipk 包進行安裝。

在openwrt的trunk目錄下,運作 make menuconfig,進行系統進行裁剪。

OpenWRT開發之——遠端debug

gdbserver在 development 目錄下。

OpenWRT開發之——遠端debug

将gdbserver選為m,儲存退出。

可以打開 .config 進行檢視:

OpenWRT開發之——遠端debug

可以看到 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,發現:

OpenWRT開發之——遠端debug

嘿!第56行,看到了嗎?禁了expat。為什麼要禁它???

部落客也就嘗試一下,把第56行删除。改成:

OpenWRT開發之——遠端debug

重新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 目錄下的才是。

<未完待續>

繼續閱讀