首页 > 其他分享 >GDB之常用命令介绍

GDB之常用命令介绍

时间:2023-04-16 10:23:26浏览次数:43  
标签:info 变量 gdb 介绍 命令 GDB 常用命令 断点 display

GDB是一个由GNU开源组织发布的,基于命令行的、功能强大的程序调试工具。可以让开发者能看到程序在执行时“内部”发生了什么,或者程序崩溃的现场。下图是gdb的吉祥物--弓箭鱼。

image-20230415163046991

GDB主要做以下4种事情:

  1. 启动程序
  2. 使程序在指定条件下停止(比如打断点)
  3. 当程序停止时,检查发生了什么
  4. 改变程序的内容,这样可以方便debug程序

1 gdb常用命令

以下主要讲一些gdb的常用命令,按照功能进行简单的区分。

程序运行相关:

命令 命令缩写 命令说明
run r 从开始运行一个待调试的程序,直到遇见断点或退出,每执行一次就会重开始执行
continue c 让暂停的程序继续运行,直至遇到下一个断点
start start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行,相当于在main函数打断点然后run)。
quit q 退出gdb调试
next n 让 gdb跳到下一条命令去执行,并不一定是下一行,而是根据程序逻辑跳转到相应的位置
step s 单步执行,遇到函数会进入
until u 运行到指定行停下来
finish fin 结束当前调用函数(直到当前函数运行完毕返回再返回),回到上一层调用函数处
return return 结束当前调用函数并返回指定值,到上一层函数调用处
jump j 将当前程序执行流跳转到指定行或地址

断点相关:

命令 命令缩写 命令说明
break b 添加断点,可带如下参数:
linenum 本地行号,即list命令可见的行号
filename:linenum 指定个文件的行号
function 函数,可以是自定义函数也可是库函数,如open
filename:function 指定文件中的函数
condtion 条件
*address 地址,可是函数,变量的地址,
delete d 删除断点,参数格式是基于标识符的,不带参数时删掉所有断点
clear 清除断点,参数格式与break相同
enable enable 启用某个断点
disable disable 禁用某个断点
watch watch 监视某一个变量或内存地址的值是否发生变化,可通过delete删除
tbreak tb 零时断点,设置方法与break相同,只不过tbreak只在断点停一次,过后会自动将断点删除

查看变量或内存:

命令 命令缩写 命令说明
print p 打印变量或寄存器值
info i 查看断点 / 线程等信息
examine x 以指定格式查看内存
display 会在每次暂停的时候输出表达式的值,display 会根据指定的模式自动选择使用 x 或是 print,取消使用undisplay n,不带参数将取消所有的
list l 显示源码清单
disassemble dis 查看汇编代码
backtrace bt 查看当前线程的调用堆栈

设置变量或内存:

命令 命令缩写 命令说明
set val i = 5 将变量i的值设置为5
set {int}&i=5 同样是将变量i的值设置为5,改变地址中的值,等价于set *(int *)&i=5

2 常用命令举例

2.1 print info x display等命令的区别

常用的print指令:

命令 作用
p var 打印变量var,变量可以是整数、浮点、字符串,数组、结构体变量等
p <表达式> 例如:p sizeof(long) 打印系统long类型所占的字节数
p i=10 改变变量的值i=10

常用的info指令:

命令 作用
info args 输出入参:argc与argv
info b 查看断点情况
info watchpoints 查看观察点情况
info display 显示display 命令查看的目标变量或表达式
info reg a4 查看寄存器a4, info reg打印所有寄存器

常用x指令:

查看内存命令语法为:

x /<Nuf> <addr>
# N 要打印的单元数,可以为负值,表示往前数
# u表示每个单元的大小(b(byte), h(halfword), w(word), g(giant, 8 bytes))
# f表示打印的格式(o(octal), x(hex), d(decimal), u(unsigned decimal),t(binary), f(float), a(address),       
#               i(instruction), c(char), s(string)and z(hex, zero padded on the left))

例如:

命令 作用
x /16x addr 以16进制显示地址以addr为起始地址的 16个值
x /-16x addr 以16进制显示地址以addr为起始地址的往前数(倒着数)16个值
x /i $pc /i 表示以机器指令显示当前pc处的指令

display命令:

display 命令也用于调试阶段查看某个变量或表达式的值,区别是会在每次暂停的时候输出表达式的值,display 会根据指定的模式自动选择使用 x 或是 print,这样方便我们观察变量。

3 调试中遇见的一些问题

3.1 打开gdb的日志功能

当我们在调试一个复杂的程序,gdb过程比较多,我们可以开启gdb的日志功能记录我们使用的gdb命令以及输出,记录在当前文件夹的gdb.txt中。

# 打开
set logging on

# 关闭
set logging off

3.2 gdb的TUI模式(Text User Interface)

在终端界面(TUI, Text User Interface)模式下, GDB可以和Visual Studio或者CLion一样像IDE一下显示和跟踪代码。

gdb -tui
# 或可在运行的过程中,执行:
Ctrl + x + a 或 tui enable
# 关闭tui模式同样执行 Ctrl + x + a 或tui disable

另外需要注意一个细节:

# 有个细节需要注意,此时的上下按键被锁定到了源码位置,如果想上下更新命令,需要如下快捷键:

Ctrl + n,下一命令(Next)

Ctrl + p,上一命令(Prev)

# 焦点切换:

focus next,切换到命令行。

focus prev,切换至源码。

进入后可食用命令行:layout用于分割窗口,可以一边查看代码,一遍测试。

layout src      # 显示源代码窗口
layout asm      # 显示汇编窗口
layout regs     # 显示源代码/汇编和寄存器窗口
layout split    # 显示源代码/汇编窗口
Ctrl+x后按2      #切换窗口类型, 可试一下Ctrl+x后按1

3.3 GDB远程调试方法

gdb远程调试用到了gdbserver,它允许gdb与调试的程序运行在不同的机器上,其实就是一个CS系统。

# 目标端开启gdbserver,启动端口
gdbserver host:2345

# 主机端运行gdb,并连接目标端口
gdb
target remote host:1234
load xxx.elf

# 查看v0-v31寄存器、vl寄存器
info reg v0
info reg vl

参考:

  1. GDB: The GNU Project Debugger (sourceware.org)
  2. dump_stack介绍以及内核符号表的生成和查找过程
  3. 原来gdb的底层调试原理这么简单
  4. 深入LUA脚本语言,让你彻底明白调试原理
  5. RISC-V 入门 Part4: 编译、链接、加载

标签:info,变量,gdb,介绍,命令,GDB,常用命令,断点,display
From: https://www.cnblogs.com/sureZ-learning/p/17322603.html

相关文章

  • NFS介绍
    NFS简介NFS(NetworkFileSystem)是一种分布式文件系统,可在不同的机器之间共享文件。它最初是由Sun公司开发的,现在已成为一种标准的网络文件系统。NFS将网络上的一个目录挂载到另一个机器上,使得另一个机器可以访问该目录中的文件。它通常用于文件共享,如共享一个文件服务器的目录。NFS......
  • Collection,List接口相关介绍
    CollectionpublicinterfaceCollection<E>extendsIterable<E>Collection实现子类可以存放多个元素,每个元素可以是Object有些Collection的实现类可以存放重复的元素,有些不可以有些Collection的实现类,有些是有序的,有些不是有序的Collection接口没有直接的实现子类,是通过它的子接口......
  • 存储引擎-InnoDb介绍
    存储引擎特点:InnoDB:是一种兼顾高可靠性和高性能的通用存储引擎,在mysql5.5之后,InnoDb是默认的mysql存储引擎特点:1.DNL操作遵循ACID模型,支持事务 2.行级锁,提高并发访问性能 3.支持外键(foreignkey)约束,保证数据的完整性和正确性文件:xxx.ibd:xxx代表的是表名,innoDb引擎的每......
  • 介绍ServiceSelf项目
    ServiceSelf做过服务进程功能的同学应该接触过Topshelf这个项目,它在.netframework年代神一搬的存在,我也特别喜欢它。遗憾的是在.netcore时代,这个项目对.netcore程序的支持没有跟进,最近项目也存档停止更新了。我在开源的一些工具里实现放了自安装和卸载服务的功能的代码,本着够用......
  • ThreadLocal 简单介绍
    目录一、什么是ThreadLocal?二、ThreadLocal如何使用?三、ThreadLocal的实现原理是什么?1、set()方法2、ThreadLocalMap3、get()方法4、remove()方法5、总结四、ThreadLocal数据共享五、ThreadLocal在Java中的应用场景有哪些?六、常见问题1、Entry的key为什么设计成弱引用?2、ThreadLo......
  • Calibre GUI PV 流程介绍(0.8um BCD Process )
    Calibre规则名词解释设计规则检查:DesignRuleCheck,DRC版图&原理图一致性检查:LayoutVersusSchematics,LVS天线效应检查:Antennaeffect,ANT电学规则检查:ElectricalRuleChecking,ERC寄生参数提取:LayoutParameterExtraction,LPE注意1:需要加的CDL文件cdl器件文件放到网......
  • docker:Dockerfile、docker私有仓库、dockercompose介绍、dockercompose部署flask+redi
    目录一、Dockerfile1.1常用和不常用命令1.2dockerfile构建一个djagno项目二、docker私有仓库2.1镜像传到官方仓库2.2镜像分层2.3私有仓库搭建三、dockercompose介绍四、dockercompose部署flask+redis项目4.1新建flask项目app.py4.2编写Dockerfile--》用于构建flask项目的......
  • docker,Dockerfile,docker私有仓库,dockercompose介绍,dockercompose部署flask+redis项目,d
    内容回顾容器操作dockerstart容器id启动容器dockerstop容器id停止容器dockerrm 容器id删除容器ockerrm`dockerps-aq`#正在运行的容器不能删除dockerexec容器id命令让容器执行命令dockercp宿主机目录容器id:容器目录#目录要存在dockercp容......
  • i7cpu温度90度会坏吗详细介绍
    有很多喜欢玩游戏的小伙伴在选择CPU的时候都会选择IntelCorei7处理器,那么这款i7cpu温度90度会坏吗?下面就为大家带来详细介绍。【CPU温度多少正常相关介绍】i7cpu温度90度会坏吗:答:i7cpu温度90度不会坏。i7cpu温度90度不会坏,会损伤到硅晶体的温度大概在115度,只要低于该温度就......
  • 鲁大师能否杀毒详情介绍
    小伙伴们有了电脑之后肯定都会要下载个杀毒软件来保护电脑,鲁大师名气响亮很多的用户就很好奇他是否可以杀毒呢?下面就一起来看看详细的介绍吧。鲁大师能否杀毒:答:不可以。1、鲁大百师是硬件检测和优化工具,是不具有杀毒功能的,建议使用正规度的杀毒软件来保护系统。2、现在主流的......