Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42115
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-15 19:37
文章分类
文章存档

2015年(21)

我的朋友

分类: 嵌入式

2015-04-16 20:44:36

一、概述
    可能我们都熟悉直接在发行版linux系统下调试系统,只需要在安装系统的时候包含了调试工具,直接可以根据gdb进行调试。但对于很多做嵌入式的来说,可能经常需要调试运行在开发板上的应用程序,下面就来说说。

   先说一下我们的调试原理:首席会在开发板上运行一个gdbserver,通过gdbserver接收develop机器的命令,然后通过gdbserver控制开发板的程序运行。gdbserver就相当于开发板应用程序和develop机器之间的桥梁,一方面从develop机器上接收命令控制开发板的应用程序;另一方面,会向开发板报告程序的运行情况,如各种变量的值,方面开发人员调试和观察(这不就是我们调试的目的嘛)。在develop上要装有arm-none-linux-gnueabi-gdb(不一定是这个名字,是属于交叉编译工具链中的gdb,不是发行版linux自带的),用它在develop上启动应用程序,并和开发板联机,通过在develop上输入命令来调试开发板上运行的程序。

二、安装工具:arm-none-linux-gnueabi-和gdbserver

交叉编译器的名字是arm-none-linux-gnueabi-gcc(根据你自己的交叉编译工具,有的可能是arm-linux-gcc,下面会用到

1. 从下载gdb,解压,进到相关目录

2. 编译GDB

#cd gdb-7.2
#./configure --target=arm-none-linux-gnueabi --prefix=/usr/local/arm-gdb   // 上面提到的交叉编译器,就是用在这里因为我们target上运行
                                                                                                            // 的应用程序是用它编译出来的
#make
#make install           // 生成在/usr/local/arm-gdb/bin下
把bin下面生成的arm-none-linux-gnueabi-gdb拷贝到交叉编译链目录中或修改环境变量把它的路径加进去,这样我们可以直接用这个命令

3. 编译GDB Server
#cd ./gdb/gdbserver       // 即是目录gdb-7.2/gdb/gdbserver
#./configure --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi
#make CC=arm-none-linux-gnueabi-gcc     //编译用于目标机的stub程序  生成gdbserver是GDB客户端程序,在板子上运行
之后在~/gdb/gdbserver文件夹下生成可执行文件gdbserver
然后将gdbserver拷贝到板子上的某个bin目录下即可。

三、调试步骤

201.123.116.65:5678代表开发板的ip是201.123.116.65,5678是任意给的端口

1.在开发板上:
[root@ATP2400 test-drv]# gdbserver 201.123.116.65:5678 test
Process server created; pid = 907
Listening on port 5678
注意:编译的test程序必须加了调试信息,即编译时加上“-g”

2.在develop上:
[root@ATP2400 test-drv]# arm-none-linux-gnueabi-gdb test
进入到gdb,然后
(gdb) set solib-absolute-prefix /nfsdir/atp2400/mini-rootfs-pgy-1808
(gdb) set solib-search-path /nfsdir/atp2400/mini-rootfs-pgy-1808/lib
(gdb) target remote 201.123.116.65:5678
Remote debugging using 201.123.116.65:5678
warning: Can not parse XML target description; XML support was disabled at compile time
Reading symbols from /nfsdir/atp2400/mini-rootfs-pgy-1808/lib/ld-linux.so.3...(no debugging symbols found)...done.
Loaded symbols for /nfsdir/atp2400/mini-rootfs-pgy-1808/lib/ld-linux.so.3
0xb6fda7b0 in _start () from /nfsdir/atp2400/mini-rootfs-pgy-1808/lib/ld-linux.so.3

解读:上面在gdb下面的操作如果直接执行target remote 201.123.116.65:5678系统会抱怨
说库不匹配,因为启动的gdb是arm-none-linux-gnueabi-gdb,是属于运行开发板程序的gdb,
所以需要用到的动态链接库也应该是arm的,而不是本地库,本地库是支持X86的。前两句就是
设置动态链接库的路径的,/nfsdir/atp2400/mini-rootfs-pgy-1808/是我做的开发板文件系统
的源文件

3.然后就可以直接进行调试了
(gdb) b main
Breakpoint 1 at 0x8698: file server.c, line 19.
(gdb) l
5 #include
6 #include
7 #include
8
9 #define SOCKET_PORT 7000
10 #define BUF_SIZE 512 
11 int main(int argc, char *argv[])
12 {
13 int fd;
14 struct sockaddr_in svraddr;
(gdb) c
Continuing.


Breakpoint 1, main (argc=1, argv=0xbefffe94) at server.c:19
19 int n = 0;
(gdb)

由现象可以看到在通过develop调试开发板的应用程序时,开发板是不接受任何命令的,用串口终端进行输入会没有任何反应,
只有develop下的gdb退出后,开发板才可以正常接收命令

关于gdb调试命令,请网上查阅。

阅读(1034) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~