gdb+gdbserver调试arm-linux程序
gdb+gdbserver调试arm-linux程序 分类: LINUX引用:http://www.xxlinux.com/linux/article/accidence/install/20070531/8639.html我的环境:Fedora 14 虚拟机编译器:arm-linux-gcc-4.3.2开发板:TQ2440嵌入式Li
·
分类: LINUX
引
用:http://www.xxlinux.com/linux/article/accidence/install/20070531/8639.html
Fedora 14 虚拟机
编译器:arm-linux-gcc-4.3.2
开发板:TQ2440
嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。调试时,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。
必须要在你想要安装的目录下执行下边的命令,主要是完成一定的配置。
一、编译安装gdb+gdbserver
首先下载gdb源码,我下载的是gdb-7.0.1.tar.gz,然后解压缩到相应的文件夹。
[gong@Gong-Computer testprogram]$ tar -jxvf /mnt/hgfs/Linux/Source/gdb-7.0.1a.tar.bz2 -C /opt/EmbedSky/
跳转到解压缩好的文件夹
[gong@Gong-Computer testprogram]$ cd /opt/EmbedSky/
创建安装目录mygdb
[gong@Gong-Computer EmbedSky]$ make mygdb
[gong@Gong-Computer EmbedSky]$ cd mygdb/
必须要在你想要安装的目录下执行下边的命令,主要是完成一定的配置。
[gong@Gong-Computer mygdb]$ ../gdb-7.0.1/configure -target=arm-linux --prefix=/opt/EmbedSky/mygdb
参数说明:target是目标板,我的是arm-linux,prefix是要安装的目标文件夹。
安装,一般会需要一段时间:
[gong@Gong-Computer mygdb]$ make;make install
创建gdbserver:
然后建立gdbserver。
[gong@Gong-Computer mygdb]$ mkdir gdbserver
[gong@Gong-Computer mygdb]$ cd mygdbserver/
修改权限,添加可执行选项,并设置好相应的配置项:
[gong@Gong-Computer mygdbserver]$ ../../gdb-7.0.1/gdb/gdbserver/configure --host=arm-linux --prefix=/opt/EmbedSky/mygdb/mygdbserver
安装:
[gong@Gong-Computer mygdbserver]$ make;make install
[gong@Gong-Computer mygdbserver]$ arm-linux-strip gdbserver
去除调试信息,具体为什么不知道,按照别人的做的。
复制gdbserver到开发板的文件系统中就可以了。
去除调试信息,具体为什么不知道,按照别人的做的。
复制gdbserver到开发板的文件系统中就可以了。
[gong@Gong-Computer mygdbserver]$ cp gdbserver /opt/filesystem/nfsroot/bin/gdbserver
二、调试步骤
1、交叉编译,带参数-g加入调试信息。
假设要调试的程序为HelloWorld.c。
[root@Gong-Computer opt]# arm-linux-gcc -g HelloWorld.c -o HelloWorld
2、在TQ2440上开启gdbserver
#gdbserver <host-ip>:port HelloWorld,host-ip是主机的ip地址,port是端口号。
[root@EmbedSky /opt]# gdbserver 192.168.10.154:5412 HelloWorld
gdbserver开始监听5412端口(你也可以设其他的值),然后启动HelloWorld,看到
Process HelloWorld created; pid = 668
Listening on port 5412
3、回到Host端
[root@Gong-Computer opt]# arm-linux-gdb HelloWorld
GNU gdb (Sourcery G++ Lite 2008q3-72) 6.8.50.20080821-cvs
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi".
For bug reporting instructions, please see:
<https://support.codesourcery.com/GNUToolchain/>...
红色的说明此gdb在X86的Host上运行,但是调试目标是ARM代码。
然后启动远程调试:
(gdb) target remote 192.168.10.122:5412
Remote debugging using 192.168.10.122:5412
0x00008130 in _start ()
注意其中的IP地址是开发板的IP,其中后面的端口号一定要和之前在开发板中设置的端口后一致,这样才能进行通信。上面的形式说明远程调式开始。
建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。在主机上调试如下:
(gdb) l
1#include<stdio.h>
2#include<stdlib.h>
3
4int main()
5{
6int i = 10;
7i = i + 10;
8
9printf("HelloWorld!!!\n");
10printf("i = %d\n",i);
(gdb) l
11
12exit(0);
13}
(gdb) b 10
Breakpoint 1 at 0x8250: file HelloWorld.c, line 10.
(gdb) b 12
Breakpoint 2 at 0x825c: file HelloWorld.c, line 12.
(gdb) c
Continuing.
Breakpoint 1, main () at HelloWorld.c:10
10printf("i = %d\n",i);
(gdb) r-----------------此处说明r不能在其中运行。
The "remote" target does not support "run". Try "help target" or "continue".
(gdb) c
Continuing.
Breakpoint 2, main () at HelloWorld.c:12
12exit(0);
(gdb) p i
$1 = 20
(gdb) c
Continuing.
Program exited normally.
(gdb)
在开发板的终端上可以发现:
Remote debugging from host 192.168.10.154
HelloWorld!!!
i = 20
Child exited with status 0
GDBserver exiting
基本的调试过程与gdb调试相同,注意在启动远程调试之前,需要先传递好需要的参数才能远程协助。
一、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联系上了。
远程调试环境由宿主机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条内容
所有评论(0)