搭建交叉调试环境arm-linux-gdb与gdbserver

搭建交叉调试环境arm-linux-gdb与gdbserver

操作系统:Ubuntu9.04
开发板:博创2410s
交叉编译工具:arm-linux-gcc-4.1.1
gdb+gdbserver 是调试目标板的常用方法.
网络环境如下:HOST 192.168.1.123  Target:192.168.1.21
NFS共享目录: mount -t nfs -o intr,nolock,rsize=1024,wsize=1024192.168.1.123:/home/lingd/arm2410s /tmp
天蓝色:命令
紫色:命令运行结果
红色:需要注意的

1、准备工作
建立安装目录,并修改目录权限
lingd@ubuntu:~$ sudo mkdir -p/opt/crosstool/arm-gdb
lingd@ubuntu:~$ sudo chown -R lingd/opt/crosstool/arm-gdb
(" chown"  is referedinto http://www.linuxquestions.org/questions/ubuntu-63/sudo-chown-operation-not-permited-543589/  )
下载gdb-6.5.tar.bz2(或者更新版的gdb)
lingd@ubuntu:~$ cd downloads

2、编译arm-linux-gdb( 服务器终端)
gdb-6.5使用了autoconf/automake。因此,通过设置configure脚本的--target,--host,--prefix参数就可以方便的移植到别的平台。
--target指定了需要调试的目标机环境,一般设置为交叉编译器的前缀,比如--target=arm-linux,--target=mips-linux,--target=armv5-linux-uclibc,--target的缺省值为i386-linux, 也就是i386PC机
--host指定编译后的文件的运行环境,取值可以是i386-linux或者交叉编译器的前缀,缺省为i386-linux
--prefix指定要安装的目录
lingd@ubuntu:~/downloads$ tar jxvfgdb-6.5.tar.bz2
lingd@ubuntu:~/downloads$ cd gdb-6.5
lingd@ubuntu:~/downloads/gdb-6.5$ ./configure --target=arm-linux--prefix=/opt/crosstool/arm-gdb
lingd@ubuntu:~/downloads/gdb-6.5$ make
lingd@ubuntu:~/downloads/gdb-6.5$ sudo make install
lingd@ubuntu:~/downloads/gdb-6.5$ ls/opt/crosstool/arm-gdb/bin
arm-linux-gdb arm-linux-gdbtui arm-linux-run
安装后,在/opt/crosstool/arm-gdb/bin可以看到arm-linux-gdb、arm-linux-gdbtui、arm-linux-run等
配置环境变量
lingd@ubuntu:~/downloads/gdb-6.5$ vi~/.bashrc
在文件最后加上
if [ -d /opt/crosstool/arm-gdb/bin ];then
PATH=/opt/crosstool/arm-gdb/bin:$PATH
fi
使刚配置的环境变量生效
lingd@ubuntu:~/downloads/gdb-6.5$ source~/.bashrc

3、编译gdbserver( 目标板终端)
lingd@ubuntu:~/downloads/gdb-6.5$ cd../gdb-6.5/gdb/gdbserver
lingd@ubuntu:~/downloads/gdb-6.5/gdb/gdbserver$ ./configure--target=arm-linux --host=arm-linux
lingd@ubuntu:~/downloads/gdb-6.5/gdb/gdbserver$ makeCC=/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/bin/arm-linux-gcc#这里是交叉编译器的路径
lingd@ubuntu:~/downloads/gdb-6.5/gdb/gdbserver$ ls

可以看到刚刚生成的gdbserver,将其拷贝到nfs共享目录下,因为gdbserver最终是在目标机上运行。
lingd@ubuntu:~/downloads/gdb-6.5/gdb/gdbserver$ cp gdbserver ~/arm2410s

4、拷贝libthread库(这一步不做的话,运行gdbserver会出错!)
lingd@ubuntu:~/downloads/gdb-6.5/gdb/gdbserver$ cd/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib
lingd@ubuntu:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$ls -l libthread_db*
-rwxr-xr-x 1lingd lingd 28092 2009-12-29 18:51 libthread_db-1.0.so
lrwxrwxrwx 1 lingdlingd    172009-12-29 18:51 libthread_db.so ->libthread_db.so.1
lrwxrwxrwx 1 lingdlingd    192009-12-29 18:51 libthread_db.so.1 ->libthread_db-1.0.so

将libthread_db-1.0.so拷贝到nfs共享目录下,我的是~/arm2410s,~/arm2410s/lib是我的外部库存放位置(我的根文件系统是cramfs,无法直接拷贝到目标板的/lib)
lingd@ubuntu:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$mkdir ~/arm2410s/lib
lingd@ubuntu:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$cp libthread_db-1.0.so ~/arm2410s/lib
lingd@ubuntu:/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux/lib$cd ~/arm2410s/lib
lingd@ubuntu:~/arm2410s/lib$ ln -s libthread_db-1.0.solibthread_db.so.1
lingd@ubuntu:~/arm2410s/lib$ ln -s libthread_db-1.0.solibthread_db.so

然后 在你在开发板上运行gdbserver前,先设置一下库文件搜索路径LD_LIBRARAY_PATH
minicom下
root@lingd-arm2410s:/# mount -t nfs -ointr,nolock,rsize=1024,wsize=1024192.168.1.123:/home/lingd/arm2410s /tmp
root@lingd-arm2410s:/# exportLD_LIBRARAY_PATH=${LD_LIBRARAY_PATH}:/tmp/lib

若根文件系统非只读文件系统,那你大可以直接将libthread_db-1.0.so拷贝到开发板的/lib或/usr/lib,然后建立相应的符合链接

4、测试
写一个程序, 用arm-linux-gcc -g 编译,放到nfs共享目录/home/lingd/arm2410s目录下,我的程序名为gprs
minicom下
root@lingd-arm2410s:/# cd /tmp
root@lingd-arm2410s:/tmp# ./gdbserver 192.168.1.123:6666gprs

Process gprs created; pid = 825
Listening on port 6666

其中,gpbserver使用方法:
gpbserver 主机ip地址:通信端口 要调试的程序【程序的命令行参数】
程序的命令行参数是可选的

再启动一个终端,运行如下命令
lingd@ubuntu:~$ cd arm2410s/
lingd@ubuntu:~/arm2410s$  arm-linux-gdbgprs

GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,and you are
welcome to change it and/or distribute copies of it under certainconditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type"show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu--target=arm-linux"...

(gdb) target remote192.168.1.21:6666          #连接目标: target remote开发板ip地址:通信端口
Remote debugging using192.168.1.21:6666
0x40001330 in ?? ()

(gdb)

此时,开发板终端可以看到应答信息Remote debugging from host 192.168.1.123
root@lingd-arm2410s:/tmp# gdbserver192.168.1.123:6666 gprs
Process gprs created; pid = 825
Listening on port 6666
Remote debugging from host 192.168.1.123


现在就可以通过l查看程序源码, 然后b设置断点了;运行则用命令c。

5、常用的GDB命令:

  load:装入一个程序
  symbol-file:装入符号库文件,可以是用-g参数编译的可执行文件。
  f(ile):指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe
   l(ist):列程序出源文件
   r(un):装载完要调试的可执行文件后,可以用run命令运行可执行文件
   b(reak):设置断点(break point),如b25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用bfuncname,funcname为函数的名称,


当程序运行到断点停下来时,
  c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
   p(rint):输入某个变量的值,如程序定义了一个intaa的就是,p aa就会输出aa的当前值
  n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行
  s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
   q(uit):退出GDB


使用简化命令,如l,和完整命令list,效果是一样的。
6、需要注意的问题
1)、简化命令f不一定能用,gdb会提示
(gdb) f gprs
No symbol table is loaded. Use the "file" command.
可用完整命令file代替
(gdb) file gprs
Reading symbols from/home/lingd/arm2410s/gprs...done.

2)、交错调试时我们不使用r(un)来执行程序。 因为执行完targetremote命令后,目标板程序已经在运行,所有应该用continue命令而不是run命令。如果你选择了重新运行程序,gdb会提示不知道怎么运行程序, 因为开发板那边gpbserver已经“Killinginferior”退出了.
(gdb) r
The program being debugged has been startedalready.
Start it from the beginning? (y or n) y

Starting program: /home/lingd/arm2410s/gprs
Don't know how to run.  Try "helptarget".


参考文章:
建立ARM平台上的交叉调试器gdb和gdbserver
gdb+gdbserver 是调试目标板的常用方法
http://blog.csdn.net/dllbl/archive/2008/09/14/2830813.aspx
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值