海思3559万能平台搭建:在线调试1gdb+gdbserver

前言

  一个成熟的平台,在线调试的功能自然也不可或缺。就像单片机常备的MDK IAR等集成式的IDE,Xilinx的sdk等,图形化的可视调试让debug起来非常方便,有没有一种适用广的嵌入式设备调试方法呢?通过筛选对比和踩坑经历,以海思平台为例,总结了gdb+gdbserver+vscode插件的方法,本篇重点介绍gdb的使用

GDB

  gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是 UNIX/LINUX 操作系统下强大的程序调试工具。 gdb 支持多种语言,包括 Ada、汇编、 C/C++、 D、 Fortran、 GO、Objective-C、 OpenCL、 Modula-2、 Pascal 和 Rust。关于 gdb 更多详细的信息请到 gdb 官网查阅,gdb 官网地址为:

www.gnu.org。

  一般的桌面 Linux 系统,比如 ubuntu、 centos 等,我们可以直接运行 gdb 来调试程序。但是嵌入式中芯片性能一般比较弱,所以直接在嵌入式系统中运行 gdb 不太现实(性能强大的嵌入式芯片可以这么做)。嵌入式系统中一般在 PC 端运行 gdb 工具,源码也是在 PC 端,源码对应的可执行文件放到开发板中运行。为此我们需要在开发板中运行 gdbserver,通过网络与 PC 端的 gdb 进行通信。因此要想在 PC 上通过 gdb 调试嵌入式程序,那么需要两个东西: gdb 和gdbserver,其中 gdb 是运行在 PC 上的, gdbserver 需要我们移植到开发板上。

GDB下载和安装

  首先到 gdb 官网上获取源码,地址为

http://www.gnu.org/software/gdb/download/

配置

./configure --prefix="$PWD/install" --target=aarch64-himix100-linux --host=aarch64-himix100-linux --program-prefix=hisi-

  --target: 目标机交叉编译器前缀,也就是你所使用的交叉编译器前缀
  --host: 指定编译后的程序在哪里运行,编译 gdb 的时候就需用设置(有时候是需要在 PC上运行的)
  --prefix: 指定安装目录。
  因为A53的性能还是比较强大的,就直接一起编译了,也有情况是板子性能差时,gdb需要在pc运行,gdbserver在板子上运行
  注意:gdb 编译比较奇葩!不能直接在 gdb 源码目录下进行配置和编译,必须新建一个文件夹,然后在此文件夹下配置和编译,切记!
  gdbserver的编译同理,可以单独进入 gdb-8.3/gdb/gdbserver 目录下配置编译
  安装时可能会遇见一些稀奇古怪的报错,粘贴百度都能搜见
  为了使用方便,编译完后配置环境变量就可以直接使用了(板子上)

PATH="/mnt/gdb-8.3/install/bin:$PATH"

  查看版本--versionok的话就说明我们的配置成功了

测试

demo

  直接运行查看当前的应用,发现是海思编完的应用默认是没有调试符的!
在这里插入图片描述
  因为是第一次使用gdb,很多尝试不太熟悉,当时首先怀疑的就是我对gdb的配置有没有配对,就想自己先交叉编译个测试demo来证明我们的平台和gdb都是可以正常搭配使用的

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
  {
  unsigned int times = 0;
 
    while(1) {
        printf("runing times:%d\r\n", times);
        times++;
    sleep(1);
    }
  }

aarch64-himix100-linux-gcc gdbtest.c -o gdbtest -g

  再次运行没有任何问题

海思

  其实一般来说,出现这样的情况首先要排查的就是-g参数
  海思的Makefile因为要照顾整个平台,所以需要从很多文件里才能拼接起来,看起来会比较麻烦,首先看编应用的Makefile,刚开始就引用了上一级include …/Makefile.param,然后我们在进入,这些参数尤其是-g应该放在交叉编译里最靠前的位置,我们开始查找cflags
在这里插入图片描述
  很明显是默认就带了-g参数的
  (如果没找到或者不确定的情况下make –n,查看下make到底都执行了什么)海思的make执行的还是比较多的,但是-g参数需要靠前很容易找见
在这里插入图片描述
  那就怀疑会不会是被裁剪了呢?看手册BSP问答中提到海思可能会strip
在这里插入图片描述
  nm 看一下
在这里插入图片描述
  和正常未裁剪的对比
在这里插入图片描述
  果然是少了。那就是从o到bin的过程中被裁剪了
在这里插入图片描述
  grep搜索全局,却只有在编译平台的规则下(rules.mak文件)才能搜索到strip信息:
在这里插入图片描述
  搜到其他博主提到的老版本35xx的debug开关在rules.mak的位置,文件规则是用来编译平台的,当然为了验证加了一行显眼的打印(或者乱码)证明这个mak规则对我们编应用并不起任何作用
  也是根据类似经验,既然debug和release的版本不再这,会不会因为版本更新换了其他的位置呢?在分析make -n看到编译的内容时看到了大量的release
在这里插入图片描述
  带有HI_RELEASE像是release版本吗?
  在应用的Makefile里包含了上一级的Makefile.param,这里面又包含了上级的Makefile.param,又包含到同级目录下的cfg.mak,找到了这个release开关,发现此时配置的确实是release模式,debug模式被注掉了,按照注释打开CONFIG_RELEASE_TYPE_DEBUG,
在这里插入图片描述
  CONFIG_HI_RLS_MODE也对应的做出修改为HI_DEBUG,因为Makefile.param里注释有

# Whether support the debug information. HI_DEBUG or HI_RELEASE or AXIS
export HI_RLS_MODE?=$(CONFIG_HI_RLS_MODE)

  自信改完,发现根本不生效
在这里插入图片描述
  cfg.mak会被覆盖吗?那就在cfg.mak.multicore里更改!
  可惜还是没有任何作用
  那还会是哪儿裁剪了呢?
  无奈又去咨询大佬,大佬提到,编译器的优化等级也坑可能影响
  再次搜索make -n的日志
在这里插入图片描述
  发现优化等级为O2,
  Makefile.pram里更改O2等级为最低
在这里插入图片描述
  然而,还是不行!
  感谢海哥的慧眼,发现了隐藏颇深的-s

在这里插入图片描述
  这个参数有什么用呢?
在这里插入图片描述
  在Makefile里查找
在这里插入图片描述
  终于调试符没问题了!!!!!!
在这里插入图片描述
  板端:hisigdbserver 192.168.119.200:2001 platform启动应用程序
  PC:target remote 192.168.119.200:2001 远程登录调试

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快跑bug来啦

创作不易,来点动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值