gdb+gdbserver交叉编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.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交叉编译的主要内容,如果未能解决你的问题,请参考以下文章

应用调试GDB

gdbserver远程调试嵌入式linux应用程序方法

(OK) 编译cBPM—CentOS7—gdb—gdbserver—成功—调试

gdbserver 跟踪点臂支持

使用gdb+gdbserver调试应用程序

Windows下通过ARM目标板上的gdbserver进行远程调试的方法