分类: LINUX
2010-02-08 14:56:59
某些时候由于模拟环境的限制,调试必须要在目标板上进行。由于资源比较有限,一般不能在目标板上直接构建GDB的调试环境,这时我们通常采用gdb+gdbserver的远程调试方法:gdbserver在目标板中运行,而gdb则在主机上运行。
构建gdb+gdbserver调试环境的在于,要将gdb和gdbserver都编译成适用于目标板的版本。比如我们用x86的主机和目标板,平时在主机上直接调试的时候都使用用于x86调试的gdb,但这个gdb不能用于远程调试中,需要针对平台进行配置之后重新编译才行;而gdbserver要运行在目标板上,则需要用arm-linux-gcc编译才行。
我们可以从 或其他站点下载GDB的源代码来进行编译。得到源代码包gdb-6.6.tar.gz之后,将target配置成arm-,然后进行编译:
$ tar xzvf gdb-6.6.tar.gz $ cd gdb-6.6 $ ./configure --target=arm-linux $ make $ make install |
注意这时我们编译的是用于主机上的gdb程序,因此仍然用x86版本的gcc编译,而不是用arm-gcc。而接下来我们要编译的gdbserver程序则是运行在目标板上的,需要用arm-gcc来编译了,用CC=
$ cd gdb/gdbserver/ $ ./configure --target=arm-linux --host=arm-linux $ make CC=/opt/toolchain/bin/arm-linux-gcc $ make install |
得到gdb和gdbserver之后,将gdbserver下载到目标板上就可以进行远程调试了。我们还是以前面用过的overflow程序为例来说明,注意overflow程序也需要重新用arm-linux-gcc编译得到版本的overflow程序,并下载到目标板上。
完成这些之后可以用file命令来检查所准备gdb和gdbserver及overflow程序的格式是否正确:
|
注意确保在目标板上运行的gdbserver及overflow程序被编译成 ELF格式,而gdb由于是运行在主机上,还是x86格式的。
gdb和gdbserver之间可以通过TCP(格式为host:port)、UDP(格式为udp: host:port)或者串口(比如/dev/ttyb)来通信,我们以TCP方式为例来说明。
假设目标板的IP为192.168.2.1,主机为192.168.2.100,使用端口5678来调试,首先在目标板上运行gdbserver:
|
然后在主机上运行gdb,并运行gdb命令“target remote 192.168.2.1:5678”:
|
接下来你就可以象前面所介绍的那样使用gdb命令了,比如设置断点及查看变量单步执行等。