首页 > 代码库 > gdb7.10.1的交叉编译以及远程调试
gdb7.10.1的交叉编译以及远程调试
引子: 因为程序使用了第三方提供的openssl库,该openssl库是在官方源码的基础上进行定制,使用3G AT命令来收发数据,现在需要升级openssl的库,但是没有该库的定制后的源码。那么要搞清楚定制支持3G AT命令的机制,一个思路是研究openssl的收发数据机制,另一个思路就是用GDB来调试现有程序,去跟踪openssl如何和3G AT进行交互。第一个思路,要么是openssl提供架构设计文档,openssl只提供API和对应数据结构的文档,大多数开源都是如此,要么就是走读openssl的源码,word天,openssl源码会让人读到哭。那么看第二个思路,就是用GDB去调试跟踪。坑爹的是现有程序只有一套第三方交叉工具链,但是没有提供GDB工具,需要自己编译。好吧,于是就有了这篇文档。
准备
gdb-7.10.1.tar.gz
第三方工具链
cygwin 32(第三方工具链是基于cygwin 32工作的)
编译配置
#export PATH=$PATH:/usr/local/arm/3.3.4/bin
第三方的工具链的编译链接等工具的路径
#./configure --host=arm-linux --prefix=/usr/local/arm-gdb CFLAGS=-I/usr/local/arm/3.3.4/arm-linux/sys-root/usr/include LDFLAGS="-L/usr/local/arm/3.3.4/arm-linux/sys-root/lib -L/usr/local/arm/3.3.4/arm-linux/sys-root/usr/lib"
--host=arm-linux 指定目标gdb工具套件要运行的目标系统,这个同时也是工具立案编译器的前缀
--prefix=/usr/local/arm-gdb 指明要安装路径,之后make install会将生成的东西安装到这个目录下
CFLAGS=-I/usr/local/arm/3.3.4/arm-linux/sys-root/usr/include 指明交叉工具链的头文件路径
LDFLAGS="-L/usr/local/arm/3.3.4/arm-linux/sys-root/lib -L/usr/local/arm/3.3.4/arm-linux/sys-root/usr/lib" 指明交叉工具链的库路径
编译过程遇到一个问题:arm-linux-nat.c报告struct iovec结构不存在,所以iov的变量不知其size,打开arm-linux-nat.c,加了一条#include <sys/uio.h>就好了。
编译安装
#make 编译链接,会比较久,没有细算,几十分钟。
#make install 安装生成的工具到--prefix指定的目录
4.本地gdb的编译
要远程调试arm板子上的程序,还需要编译对应平台的本地gdb,说起来有点绕口,简单来讲就是:
#./configure --target=arm-linux
编译出来的GDB是cygwin下可以运行的PE32可执行程序,是可以调试arm平台代码的。
这个为了不和1-3点混淆,则另展开一份干净gdb7.10.1的代码,命名为gdb7.10.1_for_pc
然后进入该目录,用命令
#./configure --target=arm-linux --prefix=/usr/local/arm_pc
#make
#make install
之后会再--prefix下看到编译好的gdb
#ls /usr/local/arm-gdb_for_bu/bin/
arm-linux-gdb.exe arm-linux-run.exe
5.远程调试
将/usr/local/arm-gdb/bin/gdbserver拷贝到板子上,如/mnt/Nand2/gdbserver。然后转到要调试的程序所在的目录,比如要调试名字为test的程序,执行以下命令
#/mnt/Nand2/gdbserver 192.168.100.200:9527 test
192.168.100.200:9527是板子的IP和端口。
test是要调试程序名称
然后在打开cygwin,转到test程序以及源码所在的目录,
#/usr/local/ar5m_pc/bin/arm-linux-gdb.exe test
进入到gdb交互命令模式
>set sysroot /usr/local/arm/3.3.4/arm-linux-sys-root
指定交叉工具链的sysroot,这样gdb才能找到test程序对应c库的符号,才能调试,否则就不知道飞到哪里去了。
>target remote 192.168.100.200:9527
连接目标板的调试器gdbserver, 链接OK的话,目标板listen的gdbserver应会出现打印
Remote debugging from host 192.168.100.197
192.168.100.197是cygwin所在机器的IP。
之后就可以在PC的cygwin窗口gdb的命令交互模式,展开调试。呜呼~~~~~~
写完了。。。。。。
gdb7.10.1的交叉编译以及远程调试