• ARM交叉编译gdbserver并远程在线调试


    一,ARM交叉编译安装gdbserver

    1,gdbserver下载

    Linux系统自带gdb工具,可是无法用在ARM调试中,需要单独下载下来交叉编译arm-linux-gdb。gdbserver下载链接:ftp://sourceware.org/pub/gdb/releases/。下载后解压tar zxvf gdb-9.1.tar.gz。

    2,编译gdb过程中需要使用texinfo, 先安装texinfo

          sudo apt-get install texinfo

    3,然后进入cd gdb-9.1/,配置编译 arm-linux-gnueabihf端:--host=arm-linux-gnueabihf

       windows:--host不用配置,默认即可

    生成简单的makefile:执行./configure   --prefix=$pwd/__install

    生成完整的makefile,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/alinx/gdb_install

    --build:运行编译工具链的平台,也就是正在执行编译操作的平台。如果未指定此参数,则通过 config.guess 猜测得到。通常都不指定此参数。
    --host:可执行程序将运行的平台。如果未指定此参数,则和 --build 相同。如果 --host 和 --build 不同,是交叉编译;否则是普通编译。
    --target(指定目标平台):可执行程序将处理的平台。如果未指定此参数,则和 --host 相同。一般来说,程序运行在什么平台,处理的就是什么平台,此参数值和 --host 参数相同,不需显式指定,所以通常不会关注到此参数。但在制作交叉编译工具 (如 gcc、gdb 等) 这种特殊情况下,此值和 --host 不同,例如交叉编译器 arm-linux-gcc,它运行在 x86-linux 平台 (--host 参数)。如果是交叉编译一个普通的应用,如运行于arm-linux平台的 tftp 程序,则它的运行平台和处理平台都是 arm-linux 平台
    --program-prefix:指定将被加到所安装程序的名字上的前缀.例如,使用'--program-prefix=arm-linux-gnueabihf-'来configure,编译的gdb文件名为arm-linux-gnueabihf-gdb
    --prefix(指定安装路径):编译的时候用来指定程序存放路径 。不指定prefix,可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。其它的资源文件放在/usr /local/share。

    4,编译make  和 make install

    二,安装gdbserverguo过程中可能出现的问题

    1,GDB9.1 Remote ‘g’ packet reply is too long错误

    修改gdb/remote.c文件,屏蔽process_g_packet函数中的下列两行:

     if (buf_len > 2 * rsa->sizeof_g_packet)
         error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);

    换成如下几行:

    1. if (buf_len > 2 * rsa->sizeof_g_packet)
    2. {
    3. rsa->sizeof_g_packet = buf_len ;
    4. for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
    5. {
    6. if (rsa->regs[i].pnum == -1)
    7. continue;
    8. if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
    9. rsa->regs[i].in_g_packet = 0;
    10. else
    11. rsa->regs[i].in_g_packet = 1;
    12. }
    13. }

    2,arm-linux-gdb在调试的时候会加载目标系统的库文件,如果出错时便无法调试

    通过指令[set solib-search-path+库文件路径]来手动加载目标系统库文件

    (gdb) set solib-search-path /home/alinx/boot/config/gcc-linaro/arm-linux-gnueabi/libc/lib/

    三,调试步骤

    arm-linux-gnueabihf-gcc -g tcp_test.c -o transdata

    宿主机IP:172.27.226.141
    目标板IP:172.27.226.16

    1,目标板上运行gdbserver
    ./gdbserver 172.27.226.141:5000 transdata

    附录:petalinux2015.4 使用gdbserver方式:   Adding GDB to the ROOTFS:

    1. on target:
    2. mount /dev/mmcblk0p1 /mnt/
    3. ifconfig eth0 192.168.150.11
    4. ping 192.168.150.243
    5. gdbserver 192.168.150.243:2345 /mnt/linux_app.elf
    6. on host:
    7. aarch64-linux-gnu-gdb linux_app.elf
    8. (gdb) target remote 192.168.150.11:2345
    9. (gdb) break main
    10. (gdb) continue
    11. (gdb) continue

    2,宿主机上运行arm-linux-gdb

             arm-linux-gdb test

  • 相关阅读:
    谨慎redis的timeout参数
    2.Seq2Seq注意力机制
    LLaMA2模型训练加速秘籍:700亿参数效率提升195%!
    OSError: [WinError 123] 文件名、目录名或卷标语法不正确
    MySQL笔记(进阶篇)
    音视频学习 - 创建 WinUI3 + ffmpeg 的桌面程序
    C++通过位操作实现枚举控制多个状态
    详细讲解 —— 多线程初阶(一)认识线程(Java EE初阶)
    深度解析 集成运放 原理与运用
    java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
  • 原文地址:https://blog.csdn.net/wangjie36/article/details/126277070