GDB - GNU Debugger可以直接用来调试基于linux系统的嵌入式设备。
方法是利用交叉编译环境编译一份嵌入式目标系统的GDB,编译完以后把GDB二进制文件下载到目标设备上,直接在目标设备上运行GDB就可以进行调试了。
然而,有些情况下嵌入式设备的硬件资源很有限,比如我手头的这个设备,总的ROM空间只有16.5MB,固件,一些系统程序加一些库就占去了13MB+,这样我可以用的空间就只剩下3MB,而一个交叉编译得到的gdb二进制大小有将近9MB,显然是放不进去的了。所以聪明的人类想到了另一种方法
gdbserver
+gdb的方法。
gdbserver运行于嵌入式目标设备,而gdb则运行于开发主机上。gdbserver是一个只实现了很少功能的程序,一般也就设置断点或存取处理器的寄存器或者读写内存,所以这个二进制文件很小,一般也就几十KB。gdbserver管理目标设备上的被调式的程序,并等待开发主机上的gdb命令,一旦收到命令进行响应。
目标设备上gdbserver和开发主机上的gdb通过串口或者TCP进行通讯。
准备gdbserver和gdb
这里的gdbserver当然是完全运行于嵌入式目标设备的二进制文件,使用交叉编译环境生成,比如我这里是编译的时候指定
--target=arm-linux
--host=arm-linux;这里的gdb是运行于开发主机上,但是它必须具有识别目标设备的功能,类似于交叉编译的环境,所以编译时只要指定
--target=arm- linux,这里的host就是开发主机,比如我的gdb编译运行后显示--host=i686-linux
--target=arm-linux。
准备工作就绪就可以进行调试了,当然调试程序也要准备就绪,这里编译的时候编译选项需要指定-g,一般IDE的debug版本这个编译选项都会默认指定的,-g的目的就是生成一些调试符号,这样gdb可以跟踪。
1. 在目标设备端运行gdbserver
/clock/bin # gdbserver
10.0.0.2:3000
Clock.exe
Process Clock.exe
created; pid = 2312
Listening on port 3000
2. 在开发主机上运行
[clockdev@localhost bin]$ ./arm-linux-gdb
/home/clockdev/workspace/ATSClock-ARMLinux/bin/Debug/Clock.exe
GNU gdb 6.4
Copyright 2005 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-linux
--target=arm-linux"...
(gdb)
打入 target remote
10.0.0.5:3000
显示
(gdb) target remote
10.0.0.5:3000
Remote debugging using
10.0.0.5:3000
0x40000ba0 in ?? ()
(gdb)
接下来就可以使用所有的gdb命令进行调试了。
(gdb) break FingerprintEntry.cpp:405
----------设置断点
(gdb) continue -----------------继续运行程序
gdbserver+gdb调试的缺点就是查看源代码文件比较麻烦,网上有个开源软件叫 Clewn,这个软件使用VIM作为GDB的前端界面,结合GDB
的调试功能,可以动态的程序当前运行的代码显示在VIM,查看代码非常方便,运用的是gdbserver+gdb的原理,但是加了一个VIM的GUI界面。
我研究以后,再写一篇关于Clewn的文章。