在网站 http://ftp.gnu.org/gnu/gdb/ 上下载gdb-xxx.tgz源码包。任一个版本的都可,但不要太老。以下是我的交叉编译环境:
X86版本:ubuntu-12.04 (gcc),IP:192.168.0.236
开发板:MT7688(mipsel-linux-gcc) IP:192.168.0.191
GDB版本:gdb-7.3a.tar.gz
一、前言
嵌入式环境下使用GDB进行调试时,需要两个工具:xxx-gdb和gdbserver。xxx-gdb是运行在你的x86平台上的,host不需要设置,系统会默认使用你的x86环境参数;而gdbserver是运行在开发板环境下的,所以需要用host项来设置最终生成的可执行文件的运行环境。详见下文。
二、编译生成xxx-gdb
1、配置configure生成Makefile
tar -xvf gdb-7.3a.tar.gz
cd gdb-7.3
./configure --target=mipsel-linux --prefix=/home/zqjun/gdb-mips
(--target配置gdb的目标平台;--host参数指定最终生成可执行文件的运行环境,因为gdb是在x86平台上运行的,所以此处不设置host则默认使用x86平台参数;)
说明:configure的参数--build --target --host
--build=BUILD configure for building on BUILD [guessed]
build就是你正在使用的平台,一般可以不用设置。
--host=HOST cross-compile to build programs to run on HOST [BUILD]
host就是你编译好的程序所运行的平台,注意它跟target的区别。如我的程序是一个运行在MIPS平台上的程序,编译器为mipsel-linux-gcc,所以就要把host设为mipsel-linux。
--target=TARGET configure for building compilers for TARGET [HOST]
target就是你想处理的程序所运行的平台,如我的程序是一个运行在MIPS平台上的程序,编译器为mipsel-linux-gcc,所以就要把target设为mipsel-linux。
--prefix=PREFIX install architecture-independent files in PREFIX [/usr/local]
prefix配置安装路径,如果没有指定路径,则默认安装在/usr/local目录下。
2、make;
3、make install.
此时会在/home/zqjun/gdb-mips目录下生成mipsel-linux-gdb工具,拷贝到mips交叉编译工具链所在的目录即可。
三、编译gdbserver
cd gdb-7.3/gdb/gdbserver
./configure --target=mipsel-linux --host=mipsel-linux
说明:因为gdbserver是在嵌入式开发板上运行,因此要设置host项为开发板所对应的运行环境mipsel-linux。
make
编译好了之后把gdbserver挎到开发板相应目录下(或者nfs挂载的目录下)备用。
四、开始GDB调试
1、挂载NFS
#mount -t nfs -o nolock 192.168.0.236:/home/zqjun/nfs_mips /nfs
注:上面的命令是在开发板的终端上执行。
2、在开发板上运行gdbserver
在终端上切换到nfs目录下,把要运行的demo及其依赖环境等也都放置在nfs目录下。
#cd /nfs
#./gdbserver 192.168.0.236:1234 demo
注:192.168.0.236为ubuntu主机的IP,在开发板上的MIPS系统的1234端口开了一个调试进程,demo为开发上运行的程序。开发板终端上执行以上命令后,会打印输出:
Process asr_sample_mips created; pid = 1450
Listening on port 1234
3、在ubuntu主机上运行gdb
#cd /home/zqjun/nfs_mips /nfs
#mipsel-linux-gdb demo
(gdb) target remote 192.168.0.191:1234
注:192.168.0.191为开发板的IP,如果接连接成功,开发板上会输出如下信息:
Remote debugging from host 192.168.0.236
至此,gdb调试环境打通,可以开始调试了。
五、我在调试过程中遇到的两个错误:
1、错误1:
(gdb) c
Continuing.
warning: Could not load shared library symbols for /media/mmcblk0p1/taidi_asr/libs/libmsc.so.
Do you need "set solib-search-path" or "set sysroot"?
错误原因:nfs目录下gdb运行时没有找到程序所需要的libmsc.so,提示需要设置“set solib-search-path”。
解决办法:
(gdb) set solib-search-path /home/zqjun/nfs_mips/libs/
可使用info sharedlibrary 查看当前已生效的共享库路径
2、错误2:
Program received signal SIG32, Real-time event 32.
解决方法:在进入gdb之后,运行程序之前,输入handle SIG32 nostop noprint命令,可以让程序接收到sig32信号时,不挂起,也不会连续输出这条日志信息了。