S3C2410 ARM板上构造gdb +gdbserver调试环境


S3C2410 ARM板上构造gdb +gdbserver调试环境
 
远程调试环境由宿主机gdb和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。
        
       就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:
       用ROMMonitor调试目标机程序、
       用KGDB调试系统内核
       用gdbserver调试用户空间程序。
      
       这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。
而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在宿主机上运行。

      目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般linux发行版中都有一个可以运行的gdb,但开发人员不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台作一个简单配置,重新编译得到相应gdb如armv4l-unknown-linux-gdb  。
1.源程序编译
download  from  http://cygwin.mirrors.pair.com/gdb/old-releases/
$ tar jxf gdb-5.2.1.tar.bz2
$ cd gdb-5.2.1
$ mkdir obj
$ cd obj
../configure --target=armv4l-unknown-linux \
        --enable-shared --prefix=/tmp/g \
        --without-x --disable-gdbtk --disable-tui \
        --without-included-regex --without-included-gettext
$ make
$ make install
$ mkdir gdb/gdbserver 
$ cd gdb/gdbserver
$ chmod +x ../../../gdb/gdbserver/configure
$ CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc \
        ../../../gdb/gdbserver/configure armv4l-unknown-linux \
        --without-included-regex --without-included-gettext
$ make
$ cp -vf gdbreplay gdbserver /tmp/g/bin

2.远程调试

o cp  gdbserver from  host  to  target machine

o target machine
        gdbserver 59.69.74.87:2345 hello
   
出现
Process hello created; pid = 68

o host
        /tmp/g/bin/arm-linux-gdb hello
       (gdb) b main
       (gdb) target remote 59.69.75.186:2345
      出现 Remote debugging using 59.69.75.186:2345
           0x40002a00 in ?? ()

       (gdb) c  //相当于主机gdb的run命令
      
此时目标机上出现
Remote debugging from host 59.69.74.87
hello,world

  连接成功后,这时候就可以输入各种gdb命令如list、run、next、step、break等进行程序调试了。
调试结束出现                                                                               
Child exited with retcode = 0
                                                                               
Child exited with status 236
GDBserver exiting

3、多线程调试:
如果要调试的程序有线程的话,则需手动运行程序后,用下面的命令调试相应的线程
gdbserver 59.69.74.87:2345 --attach 21119
其中 21119是线路进程号

4、动态库调试:下面以datamanage模块的libdb.so动态库为例
gdb) b main //在程序入口处设个断点
Breakpoint 1 at 0xb2e8: file main.cpp, line 24.
(gdb) c
Continuing.

Breakpoint 1, main () at main.cpp:24
24        sleep( 10 );
(gdb) directory ../datamanage //加入动态库源码目录,不然gdb无法找到源文件
Source directories searched: /home/yifei/WFET2000s/L30F10-E2S01.00_NM01/Src/taskmanage/../datamanage:/home/yifei/WFET20d
(gdb) sharedlibrary //将共享库加入
Reading symbols from /home/et1000/lib/libbase.so...done.
Loaded symbols for /home/et1000/lib/libbase.so
Reading symbols from /usr/local/tools/linux/arm/gcc-3.2.2/arm-linux/lib/libpthread.so.0...done.
Loaded symbols for /usr/local/tools/linux/arm/gcc-3.2.2/arm-linux/lib/libpthread.so.0
Reading symbols from /home/et1000/lib/libparam.so...done.
Loaded symbols for /home/et1000/lib/libparam.so
Reading symbols from /home/et1000/lib/libinter.so...done.
Loaded symbols for /home/et1000/lib/libinter.so
Reading symbols from /home/et1000/lib/libdb.so...done.
Loaded symbols for /home/et1000/lib/libdb.so

(gdb) br TaskDb.cpp:35 //在动态库源程序中设断点
Breakpoint 2 at 0x400b60c0: file TaskDb.cpp, line 35.
 注意:1、主机上动态库的路径必须与目标机的路径一样
       2、主机上动态库的目录需有执行权限

 
 说明: 
1)目标机上的被调试程序hello, 与主机上的程序hello, 是相同的程序, 但位置不一样,并非是用网络共享的同一个位置的同一个文件, 一个在目标机上 ,一个在主机上, 没有关系.
2) host ip  : 59.69.74.87
   target  2410  ip : 59.69.75.186               
都是局域网ip.


gdb 的常用命令
命令 解释
  break NUM 在指定的行上设置断点。
  bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。
  clear 删除设置在特定源文件、特定行上的断点。其用法为clear FILENAME:NUM
  continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而 导致停止运行时。
  display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。
  file FILE 装载指定的可执行文件进行调试。
  help NAME 显示指定命令的帮助信息。
  info break 显示当前断点清单,包括到达断点处的次数等。
  info files 显示被调试文件的详细信息。
  info func 显示所有的函数名称。
  info local 显示当函数中的局部变量信息。
  info prog 显示被调试程序的执行状态。
  info var 显示所有的全局和静态变量名称。
  kill 终止正被调试的程序。
  list 显示源代码段。
  make 在不退出 gdb 的情况下运行 make 工具。
  next 在不单步执行进入其他函数的情况下,向前执行一行源代码。
    step 单步执行会进入其他函数
  print EXPR 显示表达式 EXPR 的值。

3.5 列出源一段源程序 === list 

3.5.1 列出某个函数
list FUNCTION 

3.5.2 以当前源文件的某行为中间显示一段源程序
list LINENUM 

3.5.3 接着前一次继续显示
list

3.5.4 显示前一次之前的源程序
list -

3.5.5 显示另一个文件的一段程序
list FILENAME:FUNCTION 或 list FILENAME:LINENUM
 
3.6 设置断点 === break

3.6.1 在函数入口设置断点
break FUNCTION 

3.6.2 在当前源文件的某一行上设置断点
break LINENUM 

3.6.3 在另一个源文件的某一行上设置断点
break FILENAME:LINENUM

3.6.5 条件断点
break ...if COND

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值