某些时候由于模拟环境的限制,调试必须要在目标板上进行。由于嵌入式系统资源比较有限,一般不能在目标板上直接构建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), not stripped $ file overflow overflow: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), not stripped $ file gdbserver gdbserver: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), not stripped |
注意确保在目标板上运行的gdbserver及overflow程序被编译成ARM 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:
# gdbserver 192.168.16.1:5678 ./overflow Process ./overflow created; pid = 618 Listening on port 5678 |
然后在主机上运行gdb,并运行gdb命令“target remote 192.168.2.1:5678”:
$ arm-linux-gdb ./overflow GNU gdb 6.6 Copyright (C) 2006 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-pc-linux-gnu --target=arm-linux"... (gdb) target remote 192.168.2.1:5678 Remote debugging using 192.168.2.1:5678 0x28556080 in ??() (gdb) |
接下来你就可以象前面所介绍的那样使用gdb命令了,比如设置断点及查看变量单步执行等。
http://hi.baidu.com/zesu/blog/item/9b709c2b41802ef2e6cd4093.html