GDB技巧分享,让你的调试变得更方便

简介: GDB是我们在嵌入式程序调试时最常使用到的调试工具,有关GDB的文章,网上早已经层出不穷。这边会分享一些GDB调试上的小技巧,也许会让大家再重新认识一下这个很熟悉的工具,也希望能让大家的调试能够更加方便。

GDB是我们在嵌入式程序调试时最常使用到的调试工具,有关GDB的文章,网上早已经层出不穷。这边会分享一些GDB调试上的小技巧,也许会让大家再重新认识一下这个很熟悉的工具,也希望能让大家的调试能够更加方便。

1 TUI模式

大家在IDE工具,如CDS、CDK、Keil中可以通过源代码对照着进行调试,非常方便。那gdb中有没有方法,能让大家也对照着源码进行调试呢。有,那就是tui模式。 在gdb命令行中输入tui enable即可进入tui模式 当然还有更快捷的方式,直接输入Ctrl-X A即可直接进入tui模式

image.png

Tui模式中默认显示的是代码的源码,此时如果输入上和下按键,不再会显示之前或者之后的gdb命令,而是在tui图形框中上下移动,此时如果需要进行命令前后翻阅,是通过Ctrl+p/n来进行的

调试的时候,如果还想查看当前代码对应的汇编指令,则可以通过输入Ctrl+X 2,这样立马会显示出当前代码行对应的汇编指令来

image.png

如果用户想查看当前的寄存器状态时,再次输入Ctrl+X 2,则可显示当前的寄存器状态,默认为通用寄存器

image.png

如果不想查看通用寄存器的,只想看控制寄存器的,则输入tui reg cr即可切换为控制寄存器的显示 输入tui reg,gdb会显示可以使用的所有寄存器模式,如gpr、cr、bank3等

image.png

注:通过输入Ctrl+X 2可在源代码界面、汇编界面、寄存器界面间不断的切换,gdb不支持Ctrl+X 3同时显示所有三个界面 另外,输入Ctrl-l可进行TUI页面的刷新

2 常用命令中蕴藏的小技巧

2.1 command

break指令是大家在调试时最常使用的指令之一,每当触发到断点时,也是调试人员最忙碌的时候,查变量查内存,分析可能导致缺陷的原因。当同一个断点可能会多次被触发时,command指令将是你调试时的利器。command指令是配合断点进行使用的,如当前已设置过断点,断点号为1,则可以通过输入command 1为断点设置后续的一系列执行指令,比如查看某片内存中的值

image.png

如上图,每次在断点处停下来时,gdb都会顺手打印出在内存0x2000起的4个word的值。

2.2 backtrace

backtrace也是大家在调试时最常用使用的指令之一,但一般大家都是仅用其来查看调用的函数帧,其实backtrace中也蕴藏着其他宝藏,首先我们先输入bt,效果大致如下图:

image.png

大家能看到bt信息的左边,有列数字,这个数字,可以通过执行frame N的方式退回到当时函数帧的情况,利用之前学习到的tui模式,往往有很好的效果。 我们先通过Ctrl+x a打开tui

image.png

此时再输入frame 1,即可退回到原benchmark_dhry_main函数中调用Proc_2的地方

image.png

通过执行frame指令跳转到对应函数帧时,通过i r查看到的寄存器值,就是执行到该对应函数时的寄存器值,对于调试是非常有帮助的哦

bt还有个很方便的功能,可以将各个函数帧中局部变量的值给打印出来 在gdb命令行中输入bt full,即可查看

image.png

2.3 thread apply

多线程调试时,thread是最常使用的指令之一,但调试人员一般都会将thread当成是线程切换的命令,其实利用thread apply可以做的事情还有很多哦,通过thread apply能够做到不切换也一样能对其他线程进行操控 比如我希望对所有线程都执行bt,就可以输入指令thread apply all bt 如果我只希望对线程2执行i r r0的操作,则可以通过输入指令thread apply 2 i r r0 如果是希望对线程1到4执行i r r1的操作,则可以通过输入指令thread apply 1-4 i r r0

以上就是我这边对gdb这边的一些分享,不知道是否有帮助到你了呢?
本文作者:wangxf
点击查看原文

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
30天前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
50 2
|
3月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
3月前
|
NoSQL 小程序 C语言
GDB调试学习(四):段错误
GDB调试学习(四):段错误
37 0
|
3月前
|
NoSQL
GDB调试学习(三):观察点
GDB调试学习(三):观察点
36 0
|
3月前
|
NoSQL
GDB调试学习(二):断点
GDB调试学习(二):断点
36 0
|
4月前
|
NoSQL Linux 程序员
Linux | 调试器GDB的详细教程【纯命令行调试】-1
Linux | 调试器GDB的详细教程【纯命令行调试】
265 0
|
30天前
|
NoSQL 算法 Shell
【C/C++ 调试 GDB指南 】详解 gdb 断点的设置方式
【C/C++ 调试 GDB指南 】详解 gdb 断点的设置方式
17 2
|
3月前
|
NoSQL Unix 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(上)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
3月前
|
NoSQL Linux
Linux系统中调试GDB调试方法入门分享
Linux系统中调试GDB调试方法入门分享
78 0
|
3月前
|
NoSQL Unix 编译器
GDB调试无行号,报dwarf error问题解决
GDB调试无行号,报dwarf error问题解决
34 0