某些时候由于模拟环境的限制,调试必须要在目标板上进行。由于嵌入式系统资源比较有限,一般不能在目标板上直接构建GDB的调试环境,这时我们通常采用gdb+gdbserver的远程调试方法:gdbserver在目标板中运行,而gdb则在主机上运行。
构建gdb+gdbserver调试环境的在于,要将gdb和gdbserver都编译成适用于目标板的版本。比如我们用x86的主机和ARM目标板,平时在主机上直接调试的时候都使用用于x86调试的gdb,但这个gdb不能用于远程调试中,需要针对ARM平台进行配置之后重新编译才行;而gdbserver要运行在目标板上,则需要用arm-linux-gcc编译才行。
我们可以从http://ftp.gnu.org/gnu/gdb/或其他站点下载GDB的源代码来进行编译。得到源代码包gdb-6.6.tar.gz之后,将target配置成arm-linux,然后进行编译:
$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=<your_arm-linux-gcc_path>来指定arm-linux-gcc编译器:
$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编译得到ARM版本的overflow程序,并下载到目标板上。
完成这些之后可以用file命令来检查所准备gdb和gdbserver及overflow程序的格式是否正确:
$file arm-linux-gdb arm-linux-gdb:ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),for GNU/Linux 2.4.17, dynamically linked (uses shared libs), notstripped $file overflow overflow:ELF 32-bit LSB executable, ARM, version 1 (SYSV), forGNU/Linux 2.4.17, dynamically linked (uses shared libs), notstripped $file gdbserver gdbserver:ELF 32-bit LSB executable, ARM, version 1 (SYSV), forGNU/Linux 2.4.17, dynamically linked (uses shared libs), notstripped |
注意确保在目标板上运行的gdbserver及overflow程序被编译成ARMELF格式,而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:
#gdbserver 192.168.16.1:5678 ./overflow Process./overflow created; pid = 618 Listeningon port 5678 |
然后在主机上运行gdb,并运行gdb命令“targetremote 192.168.2.1:5678”:
$arm-linux-gdb ./overflow GNUgdb 6.6 Copyright(C) 2006 Free Software Foundation, Inc. GDBis free software, covered by the GNU General Public License, andyou are welcometo change it and/or distribute copies of it under certainconditions. Type"show copying" to see the conditions. Thereis absolutely no warranty for GDB. Type "show warranty"for details. ThisGDB was configured as "--host=i686-pc-linux-gnu--target=arm-linux"... (gdb)target remote 192.168.2.1:5678 Remotedebugging using 192.168.2.1:5678 0x28556080in ??() (gdb) |
接下来你就可以象前面所介绍的那样使用gdb命令了,比如设置断点及查看变量单步执行等。