天天看點

gdbserver遠端調試嵌入式linux應用程式方法

此處所講的是基于gdb和gdbsever的遠端調試方法。環境為:PC機:win7、虛拟機:10.04、下位機:飛嵌TE2440開發闆。

嵌入式linux應用程式的開發一般都是在linux裡面編寫好代碼,并用交叉編譯器arm-linux-gcc編譯好之後再下載下傳到闆子上運作。如果建立了遠端調試(能夠在PC機ubuntu中調試闆子中的linux應用程式),這樣對于開發程式是極其友善的。

以下是摘自網絡上的一些方法。其中加入了自己所遇到的一些問題,并提出了解決方法。

1、首先建立nfs檔案系統,讓PC機ubuntu上的檔案系統這裡假設路徑為:/home/xxx/work/可以挂載到闆子上去。方法可以見本博的另一篇文章。其中IP環境是PC機win7的IP為192.168.0.11(這個不重要,隻要保證在同一個網段即可)。虛拟機中IP為:192.168.0.57。下位機中的IP為192.168.0.16。

2、安裝交叉編譯環境arm-linux-gcc等工具。方法可以網上找。這裡假設已經安裝好,并且版本是3.4.1。路徑為:/usr/local/arm/3.4.1/bin。并建好環境變量。

3、下面我們就來測試一個簡單的例子。

/*Hello.c*/

#include 

int main()

{

printf(“hello word!\n”);

return 0;

}

程式輸好以後确認無誤,儲存。進入程式檔案所在目錄

# arm-linux-gcc hello.c –o hello

将hello檔案放入nfs共享目錄中/home/xxx/work/中,并在序列槽終端中執行hello程式./hello。

4、安裝gdb和gdbserver

要經行gdbserver遠端調試,還必須安裝gdb遠端調試工具:

gdb的源代碼包可以從http: //ftp.cs.pu.edu.tw/Linux/sourceware/gdb/releases/下載下傳,我下載下傳的是gdb-6.6。下載下傳到某個目錄,筆者下載下傳到自己的使用者目錄

下載下傳完後,進入該目錄,配置編譯步驟如下:

#tar jxvf gdb-6.6-tar-bz2

#cd gdb-6.6

#./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v

#make

執行到此步之後我出現了如下的錯誤

cc1: warnings being treated as errors

/root/tools/gdb-6.6/bfd/elf32-arm.c: In function 'find_thumb_glue':

/root/tools/gdb-6.6/bfd/elf32-arm.c:2452: error: ignoring return value of 'asprintf', declared with attribute warn_unused_result

/root/tools/gdb-6.6/bfd/elf32-arm.c: In function 'find_arm_glue':

/root/tools/gdb-6.6/bfd/elf32-arm.c:2485: error: ignoring return value of 'asprintf', declared with attribute warn_unused_result

這個由于傳回值沒有被接收 導緻編譯中斷 這是因為makefile中加入了-Werror導緻将警告當成了錯誤

将下列檔案中的-Werror選項删除後儲存即可重新編譯成功

bfd/Makefile:185:WARN_CFLAGS = -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror

opcodes/Makefile:175:WARN_CFLAGS = -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror

接下來執行:

#make install

#export PATH=$PATH:/usr/local/arm-gdb

進入gdbserver目錄(在gdb目錄下):

#./configure --target=arm-linux –host=arm-linux

#make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc

(這一步要指定arm-linux-gcc的位置,可能跟你的不一樣)

這時,可能又會遇到一個錯誤:

/usr/local/arm/3.4.1/bin/arm-linux-gcc -c -Wall -g -O2    -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd linux-arm-low.c

linux-arm-low.c:35:21: sys/reg.h: No such file or directory

因為sys/reg.h在ubuntu中 /usr/include/sys/reg.h目錄中,是以可以加上 -I/usr/include

然後單獨運作:/usr/local/arm/3.4.1/bin/arm-linux-gcc -c -Wall -g -O2    -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd -I/usr/include linux-arm-low.c

OK!!!!!

再運作一遍

沒有錯誤的話就在gdbserver目錄下生成gdbserver可執行檔案,把它燒寫到flash的根檔案系統分區,或通過nfs mount的方式都可以。隻要保證gdbserver能在開發闆上運作就行。

5、安裝必要的庫libthread_db-1.0.so

如果你的嵌入式linux沒有安裝libthread_db-1.0.so這個庫的話,在闆子中運作gdbserver會提示錯誤。解決方法如下:

将你的arm-linux-gcc的交叉編譯環境中的/usr/local/arm/3.4.1/arm-linux/lib下的libthread_db-1.0.so檔案拷貝到下位機TE2440開發闆的根目錄下的/lib中去(可以先放入nfs共享檔案夾中然後再在序列槽終端中輸入拷貝指令)。并在/lib目錄建立一個一個指向libthread_db-1.0.so的軟連結libthread_db.so.1。

指令如下:#ln -s libthread_db-1.0.so libthread_db.so.1

執行完之後,再次運作gdbserver  ./gdbserver之後不會再提示找不到庫了。

6、調試hello程式

要進行gdb調試,首先要在目标系統上啟動gdbserver服務。在gdbserver所在目錄下輸入指令:(序列槽終端中)

#cd /tmp

#./gdbserver 192.168.2.57:2345 hello

192.168.2.57為主控端IP,在目标系統的2345端口開啟了一個調試程序(避免使用1024以下的端口号),hello為要調試的程式。

出現提示:

Process /tmp/hello created: pid="80"

Listening on port 2345

在虛拟機ubuntu中的終端裡面輸入

#cd /

#export PATH=$PATH:/usr/local/arm-gdb/bin

#arm-linux-gdb hello

(gdb) target remote 192.168.2.223:2345

(192.168.2.223為開發闆IP)

Remote debugging using 192.168.2.223:2345

[New thread 80]

[Switching to thread 80]

0x40002a90 in ??()

同時在序列槽中終端下提示:

Remote debugging from host 192.168.2.100

(gdb)

連接配接成功,這時候就可以輸入各種gdb指令如list、run、next、step、break等進行程式調試了。

至于出現了0x40002a90 in ??()的問題是因為arm-linux-gdb的共享庫路徑沒有進行設定。找不到庫檔案。通過輸入下列語句可以解決問題。

set solib-absolute-prefix /usr/local/arm/4.4.3/arm-none-linux-gnueabi/sys-root/

繼續閱讀