在海思芯片上使用GDB远程调试
1 前言
使用海思平台上(编译工具链:arm-himix200-linux)交叉编译 GDB 工具(使用版本8.2,之前用过10.2的版本,在编译 gdbserver 遇到编译出错的问题,因为关联了其他静态库等,尝试解决,但是遇到了一些其他问题,因为时间问题折腾了一段时间就放弃使用10.2的版本了)。
通过使用 gdb+gdbserver 远程调试目标板,之后可以通过 VSCode 配置好后实现和 IDE 集成开发环境一样的比较直观方便调试。
2 编译
2.1 前期准备
1)下载 gdb(网上很多,搜素就能下载,我选择的是 gdb-8.2)
2)解压缩,输入指令解压 tar -vxzf gdb-8.2.tar.gz
3)进入解压后的目录中 cd gdb-8.2
2.2 环境配置
2.2.1 编译 gdb
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目录下。
2.2.2 编译 gdbserver
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 使用步骤
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 |
终止调试。 |
在海思芯片上使用GDB远程调试的更多相关文章
- 海思3519A上移植OpenCV3.x
环境安装与准备 下载opencv3.4.1. 或者 下载opencv3.2.0. 进入到opencv所在的目录新建目录build,install 安装cmake: apt-get install cm ...
- QT-Embedded-4.5.3在海思35xx上移植
QT4.5.3在海思3520A上移植步骤-修订版 2015年3月29日星期日, 16:59:03 1.首先要保证已经安装了海思的交叉编译器: #arm-hi + Tab key to show wh ...
- Gdb远程调试Linux内核遇到的Bug
知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...
- gdb 远程调试android进程 -转
什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...
- gdb 远程调试android进程
原文:http://blog.csdn.net/xinfuqizao/article/details/7955346?utm_source=tuicool 什么是gdb 它是gnu组织开发的一个强大的 ...
- [转] 在安卓设备上使用 Chrome 远程调试功能
你的网页内容在移动设备上的体验可能和电脑上完全不同.Chrome DevTools 提供了远程调试功能,这让你可以在安卓设备上实时调试开发的内容. 安卓远程调试支持: 在浏览器选项卡中调试网站. 在原 ...
- gdb 远程调试 android native 程序
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 先看一张原理图: 我是 Linux 和 Android 双料 0 基础,目前对 gdb 了解的很浅显.(注意 ...
- DM368 arm板GDB远程调试
参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...
- ARM平台如何玩转GDB远程调试?
前 言 关于GDB工具 GDB工具是GNU项目调试器,基于命令行使用.和其他的调试器一样,可使用GDB工具单步运行程序.单步执行.跳入/跳出函数.设置断点.查看变量等等,它是UNIX/LINUX操作 ...
随机推荐
- java数组算法——数组元素的赋值2
java数组算法--数组元素的赋值2--java经典面试题:创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值.同时要求元素时的值各不相同
- echarts饼图去除圈外指向横线
series: [ { name: '实时人员信息', type: 'pie', radius: ['86%', '80%'], avoidLabelOverlap: false, label: { ...
- 论文解读(MCGC)《Multi-view Contrastive Graph Clustering》
论文信息 论文标题:Multi-view Contrastive Graph Clustering论文作者:Erlin Pan.Zhao Kang论文来源:2021, NeurIPS论文地址:down ...
- mysql的半同步复制
1. binlog dump线程何时向从库发送binlog mysql在server层进行了组提交之后,为了提高并行度,将提交阶段分为了 flush sync commit三个阶段,根据sync_bi ...
- Python GDAL矢量转栅格详解
前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(X,Y)转换到格网坐标(I,J),线栅格化方法主要有DDA算法.Bresenham算法等, ...
- 为何数据库连接池不采用IO多路复用?
今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题.IO多路复用被视为是非常好的性能助力器.但是一般我们在使用 DB 时,还是经常性采用c3 ...
- SpringBoot 三层架构 Controller、Service、Dao作用和关系详解
首先创建一个springboot项目. model层 model层也叫pojo层或者entity层,个人比较喜欢pojo层. 一般数据库的一张表对应一个pojo层,并且表中所有字段都在pojo层都一一 ...
- 【面试普通人VS高手系列】Redis和Mysql如何保证数据一致性
今天分享一道一线互联网公司高频面试题. "Redis和Mysql如何保证数据一致性". 这个问题难倒了不少工作5年以上的程序员,难的不是问题本身,而是解决这个问题的思维模式. 下面 ...
- Windows10 office 点击链接提示您的组策略阻止我们为您完成此操作。设置ChromeHTML也无效.
问题: win10环境点击office 中的网络链接时 出现了如下报错(一般在卸载了系统预装的其他浏览器后出现问题) 解决方案: 1.设置默认浏览器(已经设置可跳过) 控制面板->设置小图标 ...
- 记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策
在经过了两年的准备,以及迁移了几个应用项目积累了让我有信心的经验之后,我最近在开始将团队里面最大的一个项目,从 .NET Framework 4.5 迁移到 .NET 6 上.这是一个从 2016 时 ...