gdbserver遠端偵錯嵌入式linux應用程式方法

來源:互聯網
上載者:User

個人使用的環境:ubuntu10.04,xp,虛擬機器8.0.1,下位機arm9,s3c2410

轉自:http://blog.chinaunix.net/uid-24856020-id-2559041.html

此處所講的是基於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!!!!!

再運行一遍

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

沒有錯誤的話就在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/   以上是轉載的內容。但是經過本人的實踐:發現更改了bfd/elf32-arm.c/Makefile     opcodes/Makefile後,還有一處也是對沒有進行傳回值進行報錯。就是/gdb/cli/cli-cmds.c的一個檔案沒有對getcwd進行傳回值處理也是報錯的,於是對其上一級/gdb目錄下的Makefile變更,將WERROR_CFLAGS = -Werror 更改為WRROR_CFLAGS =  ,就是刪除了後面的-Werror之後,再執行make,成功。 需要注意的是:在整個gdb包中的Makefile在一解壓後是沒有的,是在執行了.configure 後根據Makefile.in,Makefile.am等的檔案產生的,所以在執行./configure後才產生Makefile檔案,所以如果執行make出錯,以上面的方法更改Makefile後,就不要再執行./configure了,直接執行make就可以了。否則更改的Makefile,在執行./configure後又被還原了。 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.