嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。调试时,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。
一、编译安装gdb+gdbserver
这是我的编写的编译脚本:
#!/bin/sh
rundir=$(pwd)
tar xvf gdb-6.7.1.tar.bz2
mkdir gdbserv-build
mkdir gdb-arm-linux-build
#编译arm-linux-gdb
cd gdb-arm-linux-build
CC=cc ../gdb-6.7.1/configure --target=arm-linux --prefix=$rundir/gdb_install/gdb-arm-linux
make
make install
#交叉编译gdbserver
cd ../gdbserv-build/
CC=arm-linux-gcc ../gdb-6.7.1/gdb/gdbserver/configure --host=arm-linux --prefix=$rundir/gdb_install/gdbserv
make
make install
cd ..
rm gdbserv-build -rf
rm gdb-arm-linux-build -rf
rm gdb-6.7.1 -rf
二、调试使用:
1、交叉编译,带参数-g加入调试信息。
假设要调试的程序为test.c。
#> arm-linux-gcc -g test.c -o test
2、在Target Board开启gdbserver
#> gdbserver :port test
#> gdbserver 192.168.0.1:2234 test
gdbserver开始监听2345端口(你也可以设其他的值),然后启动test,你会看到“Process test created:pid=88”
3、回到Host端
#> arm-linux-gdb /mnt/nfs/test
最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...
说明此gdb在X86的Host上运行,但是调试目标是ARM代码。
(gdb)target remote :port
gdb> target remote 192.168.0.12:2234
注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。
建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。结果输出是在Target Board端,用超级终端查看。
注意: 你可能会遇到主机和arm板都连同了但是却没有调试信息!
你可以在pc机端
gdb> symbol-file ../test (调用调试信息)
或者是:
#> ./arm-linux-gdb ../test
备注:就是要在开发板和pc主机上都要有运行的文件,调试信息是从本地的文件(../test)提取的!