gdb7.10.1的交叉编译以及远程调试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb7.10.1的交叉编译以及远程调试相关的知识,希望对你有一定的参考价值。

引子:    因为程序使用了第三方提供的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 <sys/uio.h>就好了。


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


     写完了。。。。。。 

以上是关于gdb7.10.1的交叉编译以及远程调试的主要内容,如果未能解决你的问题,请参考以下文章

linux下如何远程调试busybox?

gdbserver远程调试嵌入式linux应用程序方法

gdb+gdbserver交叉编译

delve 配合 Goland 远程调试

如何在 SSH 下远程使用 IDE 编译和调试

tvm在linux环境下的安装与编译及vscode如何配置tvm的远程连接调试环境