在海思芯片上使用GDB远程调试

使用海思平台上(编译工具链:arm-himix200-linux)交叉编译 GDB 工具(使用版本8.2,之前用过10.2的版本,在编译 gdbserver 遇到编译出错的问题,因为关联了其他静态库等,尝试解决,但是遇到了一些其他问题,因为时间问题折腾了一段时间就放弃使用10.2的版本了)。

通过使用 gdb+gdbserver 远程调试目标板,之后可以通过 VSCode 配置好后实现和 IDE 集成开发环境一样的比较直观方便调试。

2.1 前期准备

1)下载 gdb(网上很多,搜素就能下载,我选择的是 gdb-8.2)

2)解压缩,输入指令解压 tar -vxzf gdb-8.2.tar.gz

3)进入解压后的目录中 cd gdb-8.2

2.2 环境配置

1)配置生成 Makefile 文件

./configure --target=arm-himix200-linux --prefix=~/gdbTool

–target=arm-himix200-linux 意思是说目标平台是运行于ARM体系结构的linux内核;
–program-prefix=arm-himix200-linux 是指生成的可执行文件的前缀,比如 arm-himix200-linux-gdb(可选参数)
–prefix= 是指生成的可执行文件安装在哪个目录,这个目录需要根据实际情况作选择。如果该目录不存在,会自动创建(当然,权限足够的话)

2)编译、安装

make & make install

会在–prefix 指定的目录下生成四个子目录:bin、include、lib 和 share,我们需要的 arm-himix200-linux-gdb 就在其中的bin目录下。

1)进入 gdbserver 目录下(不同的版本路径不一样,比如 gdb-8.2 的路径为 gdb-8.2/gdb/gdbserver,而 gdb-10.2 的路径为 gdb-10.2/gdbserver),则指令为 cd gdb/gdbserver

2)在 gdbserver 目录下配置生成 Makefile 文件

./configure --host=arm-himix200-linux --prefix=~/gdbTool

–host=arm-himix200-linux 指定了生成可执行文件运行的平台和系统:运行于ARM平台的Linux系统
–prefix= 是指生成的可执行文件安装在哪个目录

3)编译、安装(会在–prefix 指定的目录下生成 bin 目录,gdbserver 就在 bin 目录下)

make & make install

3.1 前期准备

将之前生成的 gdbserver 调试程序放在目标板上或者通过 nfs 方式运行也可以.这样就可以用 gdb 和 gdbserve 远程调用来调试目标板上的程序了。

一般情况 gdbserver 程序较大,所以建议采用 nfs 的方式挂载在目标板上运行较好,也可以通过 strip 减少 gdbserver 的大小(删除程序中符号表、调试符号表信息等)

3.2 执行 gdbserver

在目标板上运行需要调试的程序,如

./gdbserver --remote-debug 192.168.1.100:8005 test

192.168.1.100 为宿主机的 IP 地址; 8005 是用来作为 gdb 调试监听的端口,可自行设置;test 是编译好的目标板程序
(为了更好的使用 gdb 的调试功能, 在编译目标板程序时需加入 -g 选项

3.3 执行 gdb

1、在宿主机上运行 gdb 程序

./arm-himix200-linux-gdb test

arm-himix200-linux-gdb 是编译 gdb 生成安装在 bin 目录下的文件,名称可能因为设置了 –program-prefix 参数有所改变,test 是和目标板上的 test 一样的程序文件

2、进入 gdb 调试状态后,连接目标板

(gdb) target remote 192.168.1.102:8005

192.168.1.102 为目标板的 IP 地址,8005 则是 gdb 调试监听的端口

3、连接成功后则开始运行,宿主机之后根据 gdb 指令设置断点、单步调试等功能进行调试

(gdb) r

GDB常用的调试指令

GDB 调试器提供有大量的调试选项,可满足大部分场景中调试代码的需要。如表所示,罗列了几个最常用的调试指令(包含指令缩写)及各自的作用:

调试指令 作 用

(gdb) break xxx

(gdb) b xxx

在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置。

(gdb) run

(gdb) r

执行被调试的程序,其会自动在第一个断点处暂停执行。

(gdb) continue

(gdb) c

当程序在某一断点处停止运行后,使用该指令可以继续执行,直至遇到下一个断点或者程序结束。

(gdb) next

(gdb) n

令程序一行代码一行代码的执行。

(gdb) print xxx

(gdb) p xxx

打印指定变量的值,其中 xxx 指的就是某一变量名。

(gdb) list

(gdb) l

显示源程序代码的内容,包括各行代码所在的行号。

(gdb) quit

(gdb) q

终止调试。

Original: https://www.cnblogs.com/const-zpc/p/16364427.html
Author: 大橙子疯
Title: 在海思芯片上使用GDB远程调试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581969/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • jdk8 线程池策略

    在ThreadPoolExecutor中提供了4种线程的策略可以供开发者直接使用:•AbortPolicy策略:默认策略,如果线程池队列满了丢掉这个任务并且抛出RejectedEx…

    Linux 2023年6月8日
    0118
  • 计算机硬件的读写速度差异

    现代计算机系统 存储器 寄存器 CPU时钟周期 高速缓存 主存 固态硬盘 机械硬盘 压榨CPU性能带来的问题 有序性问题 可见性问题 原子性问题 作者:小牛呼噜噜 | https:…

    Linux 2023年6月6日
    0127
  • 试吃香甜可口的《程序员面试指南》

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月6日
    077
  • Arthas-开源的java诊断工具,非常有用

    常用命令 help 查看帮助 help COMMAND 查看指定&#…

    Linux 2023年6月13日
    0138
  • 记一次echo server出现的问题

    1. 我做了什么 最近在学习如何用select函数实现echo server。期间遇到了一个关于缓冲区的问题,在这里分享给大家。 在使用read/recv, write/send类…

    Linux 2023年6月7日
    099
  • Linux解压命令

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————….

    Linux 2023年6月13日
    077
  • cobbler离线安装脚本

    cobbler离线安装脚本 配套离线安装cobbler教程 需要手动上传镜像包和离线安装包 #!/bin/bash #上传cobbler离线安装包和centos镜像包 解压离线安装…

    Linux 2023年6月7日
    0109
  • 02-MySQL关键字、Select语句执行顺序

    SQL关键字 1、分页 MySQL的分页关键词是 limit SELECT * FROM student LIMIT 2,6:查询学生表中的数据,从第三条开始,显示6条数据 2、分…

    Linux 2023年6月7日
    085
  • pysimpleGui FilesBrowse函数原始说明

    FilesBrowse: (button_text=’Browse’, target=(ThisRow, -1), file_types=((“…

    Linux 2023年6月14日
    068
  • redis高可用

    Redis-高可用(主从复制、哨兵模式、集群) 1.主从复制 1.1 主从复制简介 在 Redis 复制的基础上,使用和配置主从复制非常简单,能使得从 Redis 从服务器(下文称…

    Linux 2023年6月13日
    090
  • PyTorch 介绍 | TRANSFORMS

    数据并不总是满足机器学习算法所需的格式。我们使用 transform对数据进行一些操作,使得其能适用于训练。 所有的TorchVision数据集都有两个参数,用以接受包含trans…

    Linux 2023年6月16日
    0142
  • 表单校验

    HTML <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Typ…

    Linux 2023年6月13日
    099
  • protobuf 的交叉编译使用(C++)

    为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,在进程间通信或者设备之间通信能够提高通信速率。下面介绍 …

    Linux 2023年6月7日
    0142
  • ShardingSphere-proxy-5.0.0建立mysql读写分离的连接(六)

    一、修改配置文件config-sharding.yaml,并重启服务 # Licensed to the Apache Software Foundation (ASF) unde…

    Linux 2023年6月14日
    0117
  • Centos7 安装部署Kubernetes(k8s)集群

    一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernet…

    Linux 2023年6月7日
    0101
  • 趣谈IO多路复用的本质

    在《轻松搞懂5种IO模型》中,我发起了一个投票。 答案是【同步IO多路复用】。目前,60%的朋友答对了。原因这里解释一下。 同步和异步的概念区别 同步:线程自己去获取结果。(一个线…

    Linux 2023年6月14日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球