Gdb的安装和配置~~

转载 2009年11月04日 17:57:00

 【关键词】:gdb,gdbserver,远程调试

 

目录

一、gdb+gdbserver总体介绍... 1

二、源代码下载... 1

三、配置编译及安装下载... 1

四、gdb+gdbserver nfs调试流程... 2

五、如何利用串口调试... 3

六、实战调试... 3

七、linux下安装gdbserver问题... 5

 

一、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 Board端使用gdbserver。这样,应用程序在嵌入式目标系统上运行,而gdb调试在Host端,所以要采用远程调试(remote)的方法。进行GDB调试,目标系统必须包括gdbserver程序(在主机上正对硬件平台编译成功后下载到目标机上),宿主机也必须安装GDB 程序。一般Linux发行版中都有一个可以运行的GDB,但开发人员不能直接使用该发行版中的GDB来做远程调试,而要获取GDB的源代码包,针对arm 平台作一个简单配置,重新编译得到相应GDB。GDB的源代码包可以从

http://www.gnu.org/software/gdb/download/

http://ftp.gnu.org/gnu/gdb/   211.95.105.202:3128可以上去的,所有的版本都有啊

http: //ftp.cs.pu.edu.tw/linux/sourceware/gdb/releases/下载

ftp://ftp.gnu.org/gnu/gdb

外网的ftp我经常上不去,国内常见的开源社区的下载频道通常都有下载的http://download.chinaunix.net/download/0004000/3482.shtml,最新版本为gdb-6.5.tar.bz2。下载到某个目录,笔者下载到/opt/。 但要注意,gdb的版本需要和croostool 相匹配。

三、配置编译及安装下载
下载完后,进入/opt/目录,配置编译步骤如下:

#tar jxvf gdb-6.5-tar-bz2

#cd gdb-6.5

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

(--target配置gdb的目标平台,--prefix配置安装路径,当然其他路径也可以, .跟下面配置一致即可,须在环境变量中声明,启动arm-linux-gdb需要,可更改/etc/profile或~/.bash_profile或~/.bashrc,添加export PATH=$PATH:/usr/local/arm-gdb/bin,这样可以找到路径)

#make
 
 这里的时候

configure: error: no termcap library found
    make[1]: *** [configure-gdb] 错误 1

解决方法:sudo apt-get install libncurses5-dev

安装完后,在make就OK了!


 
#make install

(生成arm-linux-gdb,并存入/usr/local/arm-gdb /bin/,查询确认下)

也可以启动arm-linux-gdb,若成功,则证明安装无误

进入gdb/gdbserver目录:

[root@dding gdbserver]# pwd

/opt/gdb-6.5/gdb/gdbserver

[root@dding gdbserver]# 必须在gdbserver目录下运行配置命令,此时才能用相对路径

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

(--target=arm-linux表示目标平台,--host表示主机端运行的是arm-linux-gdb,不需要配置—prefix,因为gdbserver不在主机端安装运行)

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

(这一步要指定你自己的arm-linux-gcc的绝对位置,我试过相对的不行,提示make: arm-linux-gcc: Command not found,可好多人都用的相对路径,即直接赋值arm-linux-gcc,可采取make时传递参数,也可以直接修改gdbserver目录下的Makefile文件中的环境变量CC)
 


没有错误的话就在gdbserver目录下生成gdbserver可执行文件,注意此时要更改其属性,否则可能会出现无法访问的情况,chmod 777 gdbserver将其更改为任何人都可以读写执行;使用arm-linux-strip命令处理一下gdbserver,将多余的符号信息删除,可让elf文件更精简,通常在应用程序的最后发布时使用;然后把它烧写到flash的根文件系统分区的/usr/bin(在此目录下,系统可以自动找到应用程序,否则必须到gdbserver所在目录下运行之),或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。

四、gdb+gdbserver nfs调试流程
下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行 gdbserver,其实就是在宿主机的minicom下。我是在minicom下#mount 192.168.2.100:/ /tmp后做的(这里参数-o nolock可以不加,不加这一步执行得反而更快些),hello和gdbserver都是位于Linux根目录下,把主机根目录挂在到开发板的/tmp 目录下。

要进行gdb调试,首先要在目标系统上启动gdbserver服务。在gdbserver所在目录下输入命令:

(minicom下)

#cd /tmp

#./gdbserver 192.168.2.100:2345 hello
 

192.168.2.100为宿主机IP,在目标系统的2345端口(你也可以设其他可用的值,当然必须跟主机的gdb一致)开启了一个调试进程,hello为要调试的程序(必须-g加入调试信息)。

出现提示:

Process /tmp/hello created: pid=80

Listening on port 2345

(另一个终端下)

#cd /

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

#arm-linux-gdb hello

最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...,如果不一致说明arm-linux-gdb有问题

说明此gdb在X86的Host上运行,但是调试目标是ARM代码。

(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 ??()

同时在minicom下提示:

Remote debugging from host 192.168.2.100

(gdb)
 

注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。结果输出是在Target Board端,用超级终端查看。连接成功,这时候就可以输入各种GDB命令如list、run、next、step、break等进行程序调试了。

以上针对通过nfs mount和tftp的方式,只能在主机上调试好后下载到开发板上运行,如果有错误要反复这个过程,繁琐不说,有些程序只能在开发板上调试。所以笔者采用了gdbserver的远程调试方式。希望对大家调试程序有用!

五、如何利用串口调试
如果你用串口1调试hello的话,你就要现在板子上运行命令:

gdbserver hello /dev/ttyS0 (详情可以参考gdbserver目录下的readme文件)

这时gdbserver就在等待gdb的应答信号了。

然后在pc机上运行命令:

xxx-linux-gdb hello

 

在xxx-linux-gdb里敲入入下命令:

set remotedevice /dev/ttyS0(这里设置串口1)

set remote baud 9600 (这里设置串口波特率)

set debug remote 1(可选)

target remote /dev/ttyS0

操作到这儿,gdb就应该和gdbserver联系上了。

六、实战调试
1.编辑文件

# vi gdbtest.c

1 #include <stdio.h>

2

3 int

4 func(int n){

5     int   sum=0, i;

6     for (i=0; i<n; i++){

7         sum += i;

8     }

9     return sum;

10 }

11

12 int

13 main(void)

14 {

15    int   i;

16    long result = 0;

17    for (i=0; i<=100; i++){

18        result += i;

19    }

20 

21    printf("result[1-100] = %d /n", result);

22    printf("resutl[1-225] = %d /n", func(255));

23

24    return 0;

25 }

# arm-linux-gcc -g gdbtest.c -o gdbtest         // 交叉编译

2.下载文件到目标板: gdbtest和gdbserver

假设 host pc ip:192.168.1.45

     board   ip:192.168.1.180   

将文件拷贝到目标板上:

先将gdbtest和gdbserver两个文件拷贝到主机的/tftpboot目录下,此时系统主机和目标机都必须能够支持nfs

在目标板的Linux中运行:

#mount 192.168.1.108:/tftpboot /mnt/nfs

#cd /mnt/nfs

#ls

看是否有gdbtest和gdbserver两个文件。

3.运行调试

client board:

#./gdbserver 192.168.1.45:1234 gdbtest  // 目标板上运行gdbtest 监听端口1234

 

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm

./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open [root@AT91RM9200DK arm]$

 

host pc:

#cd /usr/local/arm-gdb/bin/ 以便能够运行arm-linux-gdb,但是无此必要,可在环境变量中设置此路径即可。

#copy gdbtest /usr/local/arm-gdb/bin/   // 将前面编译的文件gdbtest拷贝到此目录

#./arm-linux-gdb gdbtest

(gdb)target remote 192.168.1.180:1234   // 连接到开发板 成功后就可以

 

进行调试             

(gdb)list   or l

(gdb)break func

(gdb)break 22

(gdb)info br   

(gdb)continue   or c    // 这里不能用 run

(gdb)next   or n

(gdb)print or p    result 

(gdb) finish        // 跳出func函数

(gdb) next

(gdb) quit

建立连接后进行gdb远程调试和gdb本地调试方法相同

 

七、 linux下安装gdbserver问题
toolchain version:   gdb的版本可能和交叉编译器有很大的关系

gcc-3.3.2

glibc-2.2.5

binutils-2.15 此为croostool 3.3.2

 

安装步骤:
下载解压gdb-6.6
#cd gdb-6.6
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb –v

#make & make install

OK,然后:

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

进入gdbserver目录:

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

#make CC=/usr/local/armv5l/3.3.2/bin/armv5l-linux-gcc

出错:

/usr/local/armv5l/3.3.2/bin/armv5l-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: 没有那个文件或目录

make: *** [linux-arm-low.o] 错误 1

 

然后把/usr/include/sys/reg.h copy到/usr/local/armv5l-2.6.x/3.3.2/armv5l-linux/include/sys/reg.h,即将该文件拷贝到交叉编译器的include目录下,再make,显示错误:

/usr/local/armv5l/3.3.2/bin/armv5l-linux-gcc -c -Wall -g -O2 -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd thread-db.c

thread-db.c: In function `thread_db_err_str':

thread-db.c:95: error: `TD_VERSION' undeclared (first use in this function)

thread-db.c:95: error: (Each undeclared identifier is reported only once

thread-db.c:95: error: for each function it appears in.)

thread-db.c: In function `thread_db_get_tls_address':

thread-db.c:336: warning: implicit declaration of function `td_thr_tls_get_addr'

thread-db.c:336: warning: cast to pointer from integer of different size

thread-db.c:340: warning: cast from pointer to integer of different size

make: *** [thread-db.o] 错误 1

本想继续fix error,但是感觉不太对,请问各位,是什么原因呢?

是不是CC的target写错了?应该是arm-linux还是armv5l-linux?

 

1.

make: *** [linux-arm-low.o] Error 1

[root@dding gdbserver]#

[root@dding gdbserver]# gedit config.h

/* Define to 1 if you have the <sys/reg.h> header file. */

/*define HAVE_SYS_REG_H 1  */

/*have no  <sys/reg.h> header file. so undefine 20070402 dding  */

2.

thread-db.c: In function `thread_db_err_str': gdb6.5

thread-db.c:95: `TD_VERSION' undeclared (first use in this function)

[root@dding gdbserver]# gedit config.h

     94 #ifdef HAVE_TD_VERSION

     95     case TD_VERSION:

     96       return "version mismatch between libthread_db and libpthread";

     97 #endif

/* Define if TD_VERSION is available. */

/*#define HAVE_TD_VERSION 1  */

/*have no  TD_VERSION. so undefine 20070402 dding  */

gdb6.1 没有此问题

3.

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm  gdb6.5

./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open

 

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.14:2345 mainparacarm  gdb6.1

./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open shared object file: No such file or directory

 

我已经加了libthread_db.so.1共享库为什么还打不开呢????共享库和cpu类型有关吗?
gdbserver: error while loading shared libraries: libthread_db.so.1: cannot open
shared object file: No such file or director

 

****编译GDB的时候搞成静态的就好了.我想编译选项里应该有. 要不你就在Makefile里加上CFLAGS += -static
LDFLAGS += -static
这两个的其中一个应该就可以了,不过还是两个都加上吧.

 

***/lib there is no  libthread_db.so.1 Can i use nfs to copy  libthread_db.so.1 to /lib? But now i cannot find this file, and is there any for cross 3.3.2?

 libpthread-0.8.so

libpthread.so          libpthread.so.0        libresolv-2.1.3.so

libresolv.so.2         libstdc++.a.2.10.0     libtermcap.so.2

 

[root@AT91RM9200DK arm]$cp libthread_db-1.0.so libthread_db.so.1

[root@AT91RM9200DK arm]$cp libthread_db.so.1 /lib/

[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm

./gdbserver: /lib/libc.so.6: version `GLIBC_2.2' not found (required by /lib/li)

 

难道目前的gdb 6.5 版本太高,需要内核版本和交叉编译器与之匹配?实在不行,就试试低版本的gdb

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sailor_8318/archive/2008/04/16/2295583.aspx

相关文章推荐

gdb 环境配置

(gdb) cContinuing.Error while mapping shared library sections:/work/install/bluetooth//lib/libobexft...
  • code09
  • code09
  • 2011年06月28日 16:55
  • 3782

sh: gdb: not found

1.可能是内存越界导致的
  • hytgab
  • hytgab
  • 2016年03月05日 09:24
  • 650

arm-linux-gdb 环境搭建及调试core文件

系统环境: host:ubuntu12.04 gcc:gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) target:hisi3520d开发...

编译问题点

1.错误 compress.c:14:58: fatal error: zlib.h: No such file or directory compilation terminated. 解决:...
  • namecyf
  • namecyf
  • 2012年02月27日 21:28
  • 8200

【Linux】g++/gdb的安装和vim的配置

Linux下g++/gdb的简单安装和vim的配置首先说明,本片博客所讲的g++和gdb的安装以及vim的配置仅在Centos 6.0 版本上进行了测试,所以,不同的版本可能会出现差异! 注: g++...
  • bitboss
  • bitboss
  • 2016年12月29日 14:49
  • 1999

搭建gdb调试环境

1. 下载源码 http://www.gnu.org/software/gdb/download/ 2. su root 切换到root用户 3. 打算安装到/usr/local/arm-gdb目录...
  • dyzhen
  • dyzhen
  • 2016年11月30日 14:42
  • 880

Linux下gdb的安装及使用入门

1 安装gdb 在Debian GNU/Linux Desktop中,应用程序 >> 附件 >> Root Terminal。输入密码,在Root权限下的终端下输入:...

arm-linux-gcc:Command not found的问题

折腾了一天,终于搞定了。 ubuntu没有root权限,刚开始用碰到很多麻烦,查了好多资料,终于把arm-linux-gcc:Command not found 的问题解决了。 问题:...

记录一下我的GDB配置

一:为了更好的在GDB中显示STL容器,我们首先要下载一个python脚本 PS:要确定你所安装的GDB可以执行python脚本cd ~ mkdir .gdb cd .gdb svn co svn:...

gdb-为程序设置运行的参数

有三种方法可以指定程序运行的参数,第一种方法是在命令行上直接指定;第二种方法是通过run命令提供程序运行时的参数;第三种方法是通过set args命令指定程序的参数第一种方法:为程序传递参数5root...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gdb的安装和配置~~
举报原因:
原因补充:

(最多只允许输入30个字)