引子:    因为程序使用了第三方提供的openssl库,该openssl库是在官方源码的基础上进行定制,使用3G AT命令来收发数据,现在需要升级openssl的库,但是没有该库的定制后的源码。那么要搞清楚定制支持3G AT命令的机制,一个思路是研究openssl的收发数据机制,另一个思路就是用GDB来调试现有程序,去跟踪openssl如何和3G AT进行交互。第一个思路,要么是openssl提供架构设计文档,openssl只提供API和对应数据结构的文档,大多数开源都是如此,要么就是走读openssl的源码,word天,openssl源码会让人读到哭。那么看第二个思路,就是用GDB去调试跟踪。坑爹的是现有程序只有一套第三方交叉工具链,但是没有提供GDB工具,需要自己编译。好吧,于是就有了这篇文档。


  1. 准备

    gdb-7.10.1.tar.gz

    第三方工具链

    cygwin 32(第三方工具链是基于cygwin 32工作的)

  2. 编译配置

    #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 就好了。


  3. 编译安装

    #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的命令交互模式,展开调试。呜呼~~~~~~


   写完了。。。。。。