Chinaunix首页 | 论坛 | 博客
  • 博客访问: 722415
  • 博文数量: 66
  • 博客积分: 2418
  • 博客等级: 大尉
  • 技术积分: 1659
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-28 10:04
个人简介

keep moving

文章分类

全部博文(66)

文章存档

2015年(2)

2014年(6)

2013年(7)

2011年(7)

2010年(42)

2009年(2)

分类: 嵌入式

2010-05-26 14:30:48

操作系统: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=1024 192.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

下载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 jxvf gdb-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$ make CC=/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 1 lingd lingd 28092 2009-12-29 18:51 libthread_db-1.0.so
lrwxrwxrwx 1 lingd lingd    17 2009-12-29 18:51 libthread_db.so -> libthread_db.so.1
lrwxrwxrwx 1 lingd lingd    19 2009-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.so libthread_db.so.1
lingd@ubuntu:~/arm2410s/lib$ ln -s libthread_db-1.0.so libthread_db.so

然后在你在开发板上运行gdbserver前,先设置一下库文件搜索路径LD_LIBRARAY_PATH
minicom下
root@lingd-arm2410s:/# mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.123:/home/lingd/arm2410s /tmp
root@lingd-arm2410s:/# export LD_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:6666 gprs

Process gprs created; pid = 825
Listening on port 6666

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

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

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 certain conditions.
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 remote 192.168.1.21:6666           #连接目标:target remote 开发板ip地址:通信端口
Remote debugging using 192.168.1.21:6666
0x40001330 in ?? ()

(gdb)

此时,开发板终端可以看到应答信息Remote debugging from host 192.168.1.123
root@lingd-arm2410s:/tmp# gdbserver 192.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),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,


当程序运行到断点停下来时,
   c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
   p(rint):输入某个变量的值,如程序定义了一个int a的就是,p a就会输出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)来执行程序。因为执行完target remote命令后,目标板程序已经在运行,所有应该用continue命令而不是run命令。如果你选择了重新运行程序,gdb会提示不知道怎么运行程序,因为开发板那边gpbserver已经“Killing inferior”退出了.
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y

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


参考文章:
建立ARM平台上的交叉调试器gdb和gdbserver
gdb+gdbserver 是调试目标板的常用方法
阅读(3554) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

gzhuotao2010-09-07 11:58:06

请问一下:我要调试的程序需要带参数运行,那么,在调试时除了gdbserver加上参数之外,在gdb那边要不要做其他额外的操作? 如果只在gdbserver加运行参数的话,调试时程序无法获得参数,就像没有加参数一样。