首页 > 代码库 > gdb+gdbserver交叉编译

gdb+gdbserver交叉编译

转载请注明原文出处,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.gztar xzf hello-2.6.tar.gzcd hello-2.6./configure --host=arm-none-linux-gnueabimakecd ..

结果就是一个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 nonexistantpath2     set solib-search-path /opt/FriendlyARM/toolschain/4.4.3/arm/arm-none-linux-gnueabi/lib/3     file ./hello-2.6/src/hello4     target extended-remote 192.168.1.123:12345     set remote exec-file /nfs/hello6     break main7     run

 

(gdb) target extended-remote 192.168.1.123:1234Remote debugging using 192.168.1.123:1234(gdb) set remote exec-file /nfs/hello(gdb) break mainBreakpoint 1 at 0x8c24: file hello.c, line 46.(gdb) runStarting program: /home/ubuntu/nfs/hello warning: Can not parse XML target description; XML support was disabled at compile timewarning: Unable to find dynamic linker breakpoint function.GDB will be unable to debug shared library initializersand track explicitly loaded dynamic code.Cannot access memory at address 0x0warning: 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:4646    {(gdb) 

 

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992405.html

gdb+gdbserver交叉编译