由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在宿主机上运行。要进行GDB调试,目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序,一般linux发行版中都有一个可以运行的gdb,但开发人员不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台作一个简单配置,重新编译得到相应gdb。
一 :编译gdb1、解压源码 tar xf gdb-8.1.tar.xz
2、建立gdb应用程序目录 mkdir gdb_lib
3、进入源码目录 cd gdb-8.1
4、配置 ./configure --target=arm-linux-uclibcgnueabi --enable-sim --enable-tui --prefix=/home/gdb_lib
--target :嵌入式的交叉编译工具链 --prefix :生成gdb程序目录
5、make
6、make install
7、去掉调试信息
cd ../gdb_lib/bin
strip arm-linux-uclibcgnueabi-gdb
二 、编译安装gdbserver
1、 cd gdb/gdbserver/
2、 ./configure --target=arm-linux-uclibcgnueabi --host=arm-linux-uclibcgnueabi
3、 make
4、 gdbserver目录下就生成了一个gdbserver可执行文件,拷贝到目标开发板上.
5、 去掉调试信息 arm-linux-uclibcgnueabi-strip gdbserver
三、调试
1、开发板上:
/mnt # ./gdbserver 172.16.1.109:2345 queue_arm
Process queue_arm created; pid = 803
Listening on port 2345
Remote debugging from host 172.16.1.109 /*连上之后打印*/
说明:
172.16.1.109:宿主机IP地址
2345 监听端口开
queue_arm 需要的调试程序(编译时加 -g 选项)
2、宿主机上 在gdb命令行运行 target remote 172.16.1.108:2345
dushuheng@sinovo-Soft:~/test_work$ arm-linux-uclibcgnueabi-gdb queue_arm
GNU gdb (GDB) 8.1
Copyright (C) 2016 Free Software Foundation, Inc.
(gdb) target remote 172.16.1.108:2345
Remote debugging using 172.16.1.108:2345
Reading /lib/ld-uClibc.so.0 from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /lib/ld-uClibc.so.0 from remote target...
Reading symbols from target:/lib/ld-uClibc.so.0...(no debugging symbols found)...done.
0xb6ff1e44 in _start () from target:/lib/ld-uClibc.so.0
(gdb)
三、总结
使用调试工具的技巧:确定位置--》寄存器值--》查看当前寄存器的状态(修改命令和参数),通常的方法:
1、printf
我们在程序中怀疑的地方插入print语句来了解程序的运行流程控制流和变量值的改变。 它的缺点:需要进行程序编辑,添加'printf'语句,必须重新编译,重新运行来获得输出。
2、Proc/sys文件系统
在某些情况下,我们需要弄清楚在一个运行在内核中的进程的状态和内存映射。为了获得这些信息,我们不需要在内核中插入任何代码。 相反,可以用 /proc 文件系统。在/proc的伪文件系统,保留系统启动运行就收集的运行时信息 (cpu信息, 内存容量等)。
3、GDB调试技巧:
3.1、运行程序
3.2、设置断点
3.3、打印变量、设置变量值
3.4、单步调试
。。。。
下载
100个gdb调试程序技巧
https://download.csdn.net/download/u010872301/10028367