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
相关文章
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
1255 2
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
312 0
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
672 1
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
357 10
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
1226 3
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
323 1
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
622 0
|
NoSQL Ubuntu 测试技术
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
336 1
|
NoSQL 编译器 C语言
【GDB调试技巧】提高gdb的调试效率
【GDB调试技巧】提高gdb的调试效率
429 1
|
NoSQL Ubuntu 开发工具
【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解
【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解
333 1