制作GDB和GDBServer, arm-linux-gdb

 1.可以使用crosstool,在*.sh文件中加入--gdb选项将其编译出来

2.可以单独编译,网上也有很多资料:

引用http://blog.chinaunix.net/u1/34474/showart_361451.html 内容

 

 

今后我们编译程序的时候,就用arm-softfloat-linux-gnu-gcc来编译我们的程序。

当然,应用程序的调试是开发过程中必不可少的环节之一。Linux下的GNU的调试器即是GDB。所以我们有了这个交叉编译工具链之后,可以用它来编译gdbgdbserver。如果你暂时不需要GDB的话,也可以先略过这一步。

GDB的编译安装

目前比较新的是版本是GDB6.6。其官方网站是http://www.gnu.org/software/gdb/

下载gdb-6.6.tar.gz源代码包到/usr/src下。

[root@localhost]tar –zxvf gdb-6.6.tar.gz

[root@localhost]cd gdb-6.6

配置很简单,只需要指定目标板体系结构和安装路径即可。

[root@localhost]mkdir /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6

[root@localhost]./configure --target=arm-softfloat-linux-gnu --prefix=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6 -v

[root@localhost]make

[root@localhost]make install

不要加上--host=arm-softfloat-linux-gnu, target表示将制作for arm-linux平台的,prefix是安装的路径,默认比如到/usr/bin,执行make install以后,在/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6/其中会生成一些新的文件和文件夹。其中也会包含arm...-linux-gdb等。

 

顺利的话,则在gdb6.6下生成新的目录,其中gdb工具就在bin目录下。

[root@localhost]ls –l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6

/bin

总用量 30476

-rwxr-xr-x    1 root     root     14335251 12月 29 15:53 arm-softfloat-linux-gnu-gdb

-rwxr-xr-x    1 root     root     14335296 12月 29 15:53 arm-softfloat-linux-gnu-gdbtui

-rwxr-xr-x    1 root     root      2489663 12月 29 15:52 arm-softfloat-linux-gnu-run

同样在环境变量中添加gdb的路径

[root@localhost]export PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6/bin

今后调试程序的时候,用arm-softfloat-linux-gnu-gdb来调试。

gdbserver的编译

[root@localhost]cd gdb-6.6

[root@localhost]cd gdb/gdbserver

[root@localhost] ./configure --target=arm-softfloat-linux-gnu–-host=arm-softfloat-linux-gnu

[root@localhost] make CC=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc

如果不出错的话,将在当前目录下生成两个可执行文件:gdbservergdbreplay以后就可以用gdb+gdbserver调试我们开发板上的程序了。至此,我们的交叉编译工具链已经基本建立。可以用来作为我们bootloader的编译环境了。

/*******************************************************

说说我遇到的问题:

1../configure --target=arm-softfloat-linux-gnu–-host=arm-softfloat-linux-gnu

我改为:./configure --target=arm-linux --prefix=/usr/local/arm/3.4.1/gdb6.6

我要求安装在/usr/local/arm/3.4.1/gdb6.6目录下,host表示是arm-linux主机

2. 在编译时遇到错误:/usr/local/arm/3.4.1/bin/arm-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: No such file or directory

因为sys/reg.h在Redhat /usr/include/sys/reg.h目录中,所以可以加上 -I/usr/include

然后单独运行:/usr/local/arm/3.4.1/bin/arm-linux-gcc -c -Wall -g -O2    -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd -I/usr/include linux-arm-low.c

OK!!!!!

3.然后运行 make CC=/usr/........(arm-linux-gcc的绝对位置)

4.然后运行make install

在我定义的prefix (/usr/local/arm/3.4.1/gdb6.6)下,在bin/下有一个arm-linux-gdbserver       哈哈,爽!!!!

 

后来在gdb7.4上操作:

arm-linux-gcc -c -g -O2    -I. -I. -I./../common -I./../regformats -I./../../include -Wall -Wdeclaration-after-statement -Wpointer-arith -Wformat-nonliteral -Wno-char-subscripts -Werror linux-arm-low.c

由于打开了-Werror开关,把这个去掉,重新编 linux-arm-low.c,然后再继续。

 

GDB+GDBServer的使用

在目标系统上启动gdbserver,其实就是在超级终端下或者minicom下启动gdbserver。这里将gdbserver放在宿主机的NFS设置的共享目录下/home/zzl,该目录挂载在目标板/work下。宿主机的ip192.168.1.1,目标板的ip192.168.1.33

超级终端或者minicom

[root@localhost]cd /work

[root@localhost]./gdbserver 192.168.1.1:1234 hello

出现提示:
Process /work/hello created: pid=69
Listening on port 1234

这时切换到宿主机的控制台,运行

[root@localhost] arm-softfloat-linux-gnu-gdb hello

(gdb) target remote 192.168.2.33:1234

出现提示:
Remote debugging using 192.168.1.33:1234
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()

同时在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)

连接成功,这时候就可以输入各种gdb命令如listcontinuenextstepbreak等进行程序调试了。

/*******************************************************

1. 将gdbserver或者arm-linux-gdbserver ftp到开发板上,使之可以运行。

2. 开发板上的hello文件可能是运行arm-linux-strip命令后的文件,size很小,在Linux主机上不能用strip命令生成的hello文件,使用原始的hello文件。

 

对于GDBServer出现的问题

1. GDBServer调试时出现packet error问题。

主要是虚拟机与目标机的网络连接要经过windows,数据包容易丢失。换到Linux系统下则恢复正常。

感谢原创作者
 

你可能感兴趣的:(thread,linux,redhat,Path,工具,debugging)