1. 程式人生 > >gdb+gdbserver交叉編譯

gdb+gdbserver交叉編譯

http ins search 法則 接下來 prefix clas 環境 信息

轉載請註明原文出處,http://www.cnblogs.com/flyingcloude/p/6992405.html

一、gdb、gdbserver總體介紹

遠程調試環境由宿主機GDB和目標機調試stub共同構成,兩者通過串口或TCP連接。使用 GDB標準程串行協議協同工作,實現對目標機上的系統內核和上層應用的監控和調試功能。調試stub是嵌入式系統中的一段代碼,作為宿主機GDB和目標機 調試程序間的一個媒介而存在。

就目前而言,嵌入式Linux系統中,主要有三種遠程調試方法,分別適用於不同場合的調試工作:用ROM Monitor調試目標機程序、用KGDB調試系統內核和用gdbserver調試用戶空間程序。這三種調試方法的區別主要在於,目標機遠程調試stub 的存在形式的不同,而其設計思路和實現方法則是大致相同的。

而我們最常用的是調試應用程序。就是采用gdb+gdbserver的方式進行調試。在很多情況下,用戶需要對一個應用程序進行反復調試,特別是復 雜的程序。采用GDB方法調試,由於嵌入式系統資源有限性,一般不能直接在目標系統上進行調試,通常采用gdb+gdbserver的方式進行調試。

二、配置編譯及安裝下載

嵌入式linux的GDB調試環境由Host和Target兩部分組成,Host端使用arm-linux-gdb,Target端使用gdbserver。這樣,應用程序在嵌入式目標系統上運行,而gdb調試在Host端。一般linux都有一個自帶的GDB,但是不能直接使用,而要獲取GDB源代碼包,針對ARM平臺作一個簡單配置,重新編譯得到相應的GDB。

GDB的源代碼包可以從 http://www.gnu.org/software/gdb/download/ 下載

我下載的是gdb-7.3版,放在~/Downloads目錄下

以下是配置編譯步驟:

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

--target配置gdb的目標平臺,--prefix配置安裝路徑

編譯 make

安裝 make install

至此,gdb安裝完成。

接下來為linux-arm安裝gdbserver

進入~/Downloads/gdb-7.3/gdb/gdbserver

配置

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

編譯

make CC=arm-linux-gcc

沒有錯誤的話,就在gdbserver目錄下生成gdbserver可執行文件,更改其屬性,使用任何人都可以讀寫執行。

chmod 777 gdbserver
arm-linux-strip gdbserver

將多余的符號信息刪除,可讓elf文件更精簡。

然後通過NFS傳給linux-arm,並將gdbserver放入根文件系統分區的/usr/bin

具體NFS的操作方法:http://www.cnblogs.com/flyingcloude/archive/2012/10/23/2735495.html

三、調試

下載GNU Hello

這個軟件包需要配置成使用交叉編譯;不過這其實很容易做;它只需要一個交叉編譯器的前綴。

wget http://ftp.gnu.org/gnu/hello/hello-2.6.tar.gz

tar xzf hello-2.6.tar.gz

cd hello-2.6

./configure --host=arm-none-linux-gnueabi

make

cd ..

結果就是一個ARM架構的可執行文件“hello-2.6/src/hello”。

開始調試

在linux-arm中運行 gdbserver --multi 192.168.1.123:1234

在host中,運行

arm-linux-gdb

要調試遠端的程序,我需要告訴GDB使用ARM的共享庫而不是本地庫(那些用於32位x86的);否則執行的時候調試器會抱怨說庫不匹配。

1     set solib-absolute-prefix nonexistantpath
2     set solib-search-path /opt/FriendlyARM/toolschain/4.4.3/arm/arm-none-linux-gnueabi/lib/
3     file ./hello-2.6/src/hello
4     target extended-remote 192.168.1.123:1234
5     set remote exec-file /nfs/hello
6     break main
7     run

(gdb) target extended-remote 192.168.1.123:1234
Remote debugging using 192.168.1.123:1234
(gdb) set remote exec-file /nfs/hello
(gdb) break main
Breakpoint 1 at 0x8c24: file hello.c, line 46.
(gdb) run
Starting program: /home/ubuntu/nfs/hello 
warning: Can not parse XML target description; XML support was disabled at compile time
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
Cannot access memory at address 0x0
warning: Could not load shared library symbols for 2 libraries, e.g. /lib/arm-linux-gnueabi/libc.so.6.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?

Breakpoint 1, main (argc=1, argv=0xbe85ce34) at hello.c:46
46    {
(gdb) 

轉載請註明原文出處,http://www.cnblogs.com/flyingcloude/p/6992405.html

gdb+gdbserver交叉編譯