一、概述
可能我们都熟悉直接在发行版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调试命令,请网上查阅。
阅读(3888) | 评论(2) | 转发(7) |