gdb的简单使用
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:      1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
     2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
     3、当程序被停住时,可以检查此时你的程序中所发生的事。
     4、动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。
一个调试示例
—————— 源程序:tst.c       1 #include 
      2
      3 int func(int n)
      4 {
      5          int sum=0,i;
      6          for(i=0; i cc -g tst.c -o tst 使用GDB调试: hchen/test> gdb tst   
2
3         int func(int n)
4         {
5                 int sum=0,i;
6                 for(i=0; i
gdb+gdbserver方式进行ARM程序调试
【摘要】:本文首先介绍了gdb+gdbserver相关的概念,然后介绍了其下载、编译、安装等过程;接着介绍了利用gdb+gdbserver调试应用程序的流程及实例等;最后分析了下gdb+gdbserver安装过程中的常见问题。
【关键词】: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
#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 

3 int
4 func(int n){
5     int   sum=0, i;
6     for (i=0; 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
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  header file. */
/*define HAVE_SYS_REG_H 1  */
/*have no   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
参考文档
http://blog.chinaunix.net/u/27802/showart_211833.html
http://litttlebylittle.bokee.com/5803108.html
http://www.blogcn.com/u/93/99/litcatfish/index.html

本文来自ChinaUnix博客,如果查看原文请点: http://blog.chinaunix.net/u2/88438/showart_1755820.html

gdb的简单使用和gdb+gdbserver方式进行ARM程序调试相关推荐

  1. arm调试java_使用J-Link GDB Server + Eclipse CDT进行ARM程序调试

    之前我预告过这篇文章,这段时间以来,我工作一直比较忙,而且在装修我的小破窝,生活的压力让我把业余的时间都贡献给奥山战场了,我的小牧师,杀人很慢,被杀倒是挺速度的,呵呵:想当年上学的时候,我也是副本RL ...

  2. GDB 程序调试简单实践

    用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是非常大,一般有错,直接看编译器编译结果就几乎相同知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows以下调 ...

  3. Linux —— 基础开发工具的基本使用 —— yum、vim、gcc、make和makefile,gdb的简单应用

    目录 1.由生活常识引发的思考 2.yum的概念与使用 2.1yum的概念 2.2yum的使用 3.vim的概念和使用 3.1vim的概念 3.2vim的基本操作 3.2命令模式.插入模式.末行模式的 ...

  4. [gdb] unhandled dwarf expression opcode 0x9c 解决方式 .

    需要升级dbg版本,找到最新的gbd编译一下.否则连ddd也会出现这个问题 原有的代码做了部分修改,再调试的时,p某个变量出现"dwarf2_read_address: Corrupted ...

  5. gdb x命令_Coresight及GDB使用介绍 - 大海在倾听

    参考博文:和https://www.sohu.com/a/130338404_505803 1 Coresight WHY:为什么需要 首先从命名上,可以知之一二:就是看看core在干嘛呗! 当然这只 ...

  6. Linux上程序调试的基石(2)--GDB

    3. GDB的实现  GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序.可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况.它的实现也是基于ptrace系统调用来完成的. ...

  7. Linux下的程序调试——GDB

    无论是多么优秀的程序员,都难以保证自己在编写代码时不会出现任何错误,因此调试是软件开发过程中的一个必不可少的 组成部分.当程序完成编译之后,它很可能无法正常运行,或者会彻底崩溃,或者不能实现预期的功能 ...

  8. gdb 笔记(02)— gdb 调试执行(启动调试、添加参数、附加到进程、调试 core 文件)

    在编译程序时,使用 gcc 或者 g++ 时一定要加上 -g 选项,如 gcc -g -o hello hello.c 以便调试程序含有调试符号信息,从而能够正常调试程序.否则则会出现如下提示,导致不 ...

  9. Linux环境下gdb程序调试

    目录 gdb介绍 进入gdb调试环境 指令学习 l(list)指令 b(break)指令 info b指令 d指令 r(run)指令 n(next)指令 s(step)指令 c(continue)指令 ...

最新文章

  1. C++/C++11中左值、左值引用、右值、右值引用的使用
  2. OpenStack neutron中AsyncProcess类
  3. spring-session用redis实现session共享实践
  4. 【转】四元数的推导过程
  5. Java基础知识复习(二)
  6. cmd命令操作Oracle数据库
  7. Spring、SpringBoot常见面试题与答案
  8. 允许匿名用户访问VisualSVN
  9. AcWing 338. 计数问题(数位DP)
  10. MultipartFile接口实现文件上传
  11. 自动驾驶的Pipline -- 如何打造自动驾驶的数据闭环?(上)
  12. xu2w显示屏软件下载_led显示屏控制软件下载
  13. Objective-C 入门教程
  14. 光模块基础知识【快速入门】02
  15. 解决win7资源监视器不能开启
  16. 【CamtasiaStudio学习笔记】Camtasia 9后期视频剪辑以及剪辑的视频合成教程
  17. Intent启动拨号盘,实现打电话功能
  18. 长歌行 宋 郭茂倩收编的《乐府歌词》汉代民间诗歌
  19. 为什么单线程的Redis能这么快?
  20. 百度地图API学习---隐藏百度版权标志

热门文章

  1. 云服务器镜像麻烦吗_云服务器的镜像功能有什么作用?
  2. linux 引导程序修复工具,技术|Linux下修改引导器的工具:Boot-Repair
  3. php绘图效率,对于PHP绘图技术的理解
  4. java正则 环视_正则表达式之环视(java)
  5. python删除空白没有显示_删除Python字符串中的空白
  6. html字符串使用xpath,使用XPath和regex在HTML注释中提取文本
  7. dedeampz mysql启动不了_localhost打不开?dedeampz环境启动不了?本地php环境启动失败?...
  8. windows上安装mysql
  9. python在win10怎么搭建_Win10系统如何搭建Python 3.5.2开发环境
  10. windbg分析dmp蓝屏文件_手把手教你分析漏洞 : CVE-2018-8120