https://www.cnblogs.com/xvic/p/15997498.html

栈信息

不管是操作转储文件还是用GDB设置断点进行调试,都可以输入 (gdb)bt 打印栈内容进行查看。一般的宕机BUG,看下宕机的位置,然后看下源代码基本就可以解决了。但是很多情况下简单的 (gdb)bt 还查不到问题,这时候就要涉及到比较复杂的操作。下面罗列了一些对栈的操作:

  • (gdb) bt:显示所有栈帧
  • (gdb) bt 10:显示前面10个栈帧
  • (gdb) bt -10:显示后面10个栈帧
  • (gdb) bt full:显示栈帧以及局部变量
  • (gdb) bt full 10:显示前面10个栈帧以及局部变量
  • (gdb) bt full -10:显示后面10个栈帧以及局部变量
  • (gdb) frame <栈帧编号>:进入指定的栈帧中,然后可以查看当前栈帧中的局部变量,以及栈帧内容等信息
  • (gdb) info frame <栈帧编号>:可以查看指定栈帧的详细信息
  • (gdb) up:进入上层栈帧
  • (gdb) down:进入下层栈帧

变量

调试BUG过程中查看变量信息是很有帮助的操作,查看方式如下:

  • (gdb) p <变量名>

寄存器

对于调试来说寄存器中的值也很重要,可以查看到当前正在执行的指令的地址等。具体操作罗列如下:

  • (gdb) info reg:显示所有寄存器。可以简写为:i r。如果要查看具体的寄存器可以这样:i $ebx
  • (gdb) p $eax:显示eax寄存器内容
  • (gdb) p/c $eax:用字符显示eax寄存器内容,反斜杠后面的是显示格式,可使用的格式见下表:该表在显示内存内容的x命令中也是通用的
格式 说明
x 显示为十六进制数
d 显示为十进制数
u 显示位为符号十进制数
o 显示为八进制数
t 显示为二进制数
a 显示为地址
c 显示为字符(ASCII)
f 显示为浮点数
s 显示为字符串
i 显示为机器语言(仅在显示内存的x命令中可用)

内存

可以查看具体内存地址中的内容,比如:目前执行的汇编指令,以及栈中的内容等。

  • (gdb) x $pc:显示程序指针指向位置的内容
  • (gdb) x/i $pc:显示程序当前位置的汇编指令
  • (gdb) x/10i $pc:显示程序当前位置开始往后的10条汇编指令
  • (gdb) disas $pc:反汇编当前函数

调试

断点:

调试程序中,设置断点进行调试是最方便有效的手段,因此学会如果灵活设置断点是调试的基本功。

设置断点
  • (gdb) break <函数名>:对当前正在执行的文件中的指定函数设置断点。可简写为:(gdb) b <函数名>
  • (gdb) break <行号>:对当前正在执行的文件中的特定行设置断点。可简写为:(gdb) b <行号>
  • (gdb) break <文件名:行号>:对指定文件的指定行设置断点。最常用的设置断点方式。可简写为:(gdb) b <文件名:行号>
  • (gdb) break <文件名:函数名>:对指定文件的指定函数设置断点。C++类中的方法似乎不好使。可简写为:(gdb) b <文件名:函数名>
  • (gdb) break <+/-偏移量>:当前指令行+/-偏移量出设置断点。可简写为:b <+/-偏移量>
  • (gdb) break <*地址>:指定地址处设置断点。可简写为:b <*地址>
查看、删除断点
  • (gdb) info break:显示所有断点以及监视点。可简写为:(gdb) i b
  • (gdb) delete <编号>:删除编号指向的断电或者监视点。可简写为:(gdb) d <编号>
  • (gdb) clear <行号>:删除该行的断点
  • (gdb) clear <文件号:行号>:删除该行的断点
设置无效、有效断点
  • (gdb) disble <断电编号>:当前断点设置为无效
  • (gdb) enable:当前断点设置为有效

监视点

可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。删除,查看监视点的方式与断点相同。设置监视点方式如下:

  • (gdb) watch <表达式>:表达式发生变化时暂停
  • (gdb) awatch <表达式>:表达式访问或者改变时暂停
  • (gdb) rwatch <表达式>:表达式被访问时暂停

条件断点

在调试程序过程中,有时候我们只想在某个条件下停止程序,然后进行单步调试,而条件断点就是为此而设计。下面是条件断点的操作方式:

  • (gdb) b <断点> if <条件表达式> : 例如:b main.cpp:8 if x=10 && y=10
  • (gdb) condition <断点编号>:删除该断点的条件。
  • (gdb) condition <断点编号> <条件表达式>:修改断点条件。例如:condition 1 x=10 && y=10

断点命令

每次断点发生时候,想要查看的变量很多时,如果每个变量都手动print则需要浪费很多时间。断点命令可以在断点发生时批量执行GDB命令。下面是断点命令的设置方式:

  • (gdb) commands <断点编号>

  • (gdb) >print x

  • (gdb) >print y

  • (gdb) >end

    首先输入GDB命令commands <断点编号>然后回车,这时候会出现>提示符。出现>提示符后可以输入断点发生时需要执行的GDB命令,每行一条,全部输入完成后输入end结束断点命令。

反复执行

单步执行时如果进入了你不关心的函数,你想立即跳出函数;或者进入了大循环中,你想立即循环。下面的命令可以帮到你:

  • (gdb) ignore <断点编号> <次数>:忽略N次断点
  • (gdb) c N: 执行N次指令,会忽略断点
  • (gdb) s/stepi/n/nexti N:往后执行N行,不会忽略断点
  • (gdb) finish:执行完当前函数后停止,不会忽略断点
  • (gdb) until:执行完当前循环后停止,不会忽略断点
  • (gdb) until <地址>:执行到指定地址停止

设置变量值

对变量的值进行控制,可以更快的调试自己的程序。下面就是设置变量值的方法:

  • (gdb) set variable <变量> = <表达式>:将变量的值设定为指定表达式的值。例如 set variable x=10

手动生成转储文件

  • (gdb) generate-core-file 简写为:(gdb) gcore

[转帖]gdb 常用命令的更多相关文章

  1. Linux GDB常用命令一栏

    Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明: (*** 表示可执行程序名) (2)退出:quit.有的时候输入quit后会出现相关提示:类似 ...

  2. gdb常用命令记录

    gdb常用命令 最近在研究nginx源码,gdb用于调试非常方便,之前这篇有研究过如何使用gdb调试nginx:https://www.cnblogs.com/yjf512/archive/2012/ ...

  3. GDB常用命令系列

    本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/gdb_instructions.html 本文为索引,请点击以下链接进行阅读: GDB调试原理——p ...

  4. GDB常用命令使用说明(一)

    本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/gdb_instructions1.html 全部关于gdb的文章索引请点这里 GDB(GNU Deb ...

  5. gdb 常用命令总结(精优)

    格式说明: [xxx]:可选参数,即可以指定可以不指定,实际输入的内容是 xxx <xxx>:占位参数,即必须指定的参数,实际输入的内容是 xxx gdb 常用命令: gdb [file] ...

  6. C 调试 gdb常用命令

    gdb常用命令: [root@redhat home]#gdb 调试文件:启动gdb (gdb) l :(字母l)从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) b ...

  7. Linux调试工具strace和gdb常用命令小结

    strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...

  8. 第04课:GDB常用命令详解(上)

    本课的核心内容如下: run命令 continue命令 break命令 backtrace与frame命令 info break.enable.disable和delete命令 list命令 prin ...

  9. 第07课:GDB 常用命令详解(下)

    本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 disassemble 命令 当进行一些高级 ...

  10. 第06课:GDB 常用命令详解(中)

    本课的核心内容: info 和 thread 命令 next.step.util.finish.return 和 jump 命令 info 和 thread 命令 在前面使用 info break 命 ...

随机推荐

  1. SVN工具基础知识

    SVN工具基础知识 1.简介 1.全称Subversion,是一个开放源代码的版本控制系统,Subversion 在 2000 年由 CollabNet Inc 开发,现 在发展成为 Apache 软 ...

  2. 最新系统MacOs13 Ventura(M1/M2芯片) + Parallels Desktop 18(PD18史上最强虚拟机)永久使用攻略

    众神殿内,高朋满座,胜友如云,Vmware.VirtualBox.Utm等虚拟机大神群英荟萃,只见位于C位王座上的Parallels怅惘抬头,缓缓逡巡,睥睨群小,目光到处,无人敢抬头对视. 是的,如果 ...

  3. 论文解读:ACL2021 NER | 基于模板的BART命名实体识别

    摘要:本文是对ACL2021 NER 基于模板的BART命名实体识别这一论文工作进行初步解读. 本文分享自华为云社区<ACL2021 NER | 基于模板的BART命名实体识别>,作者: ...

  4. vue2.x老项目typescript改造过程经验总结

    前言: 关于Vue2.x 的TS改造,其实没有啥好说的. 对于vue-cli项目来说,从新跑一遍 vue create xxx-project ,选择Manually select features ...

  5. Vue 应用程序性能优化:代码压缩、加密和混淆配置详解

    ​ 简介在 Vue 应用程序的开发中,代码压缩.加密和混淆是优化应用程序性能和提高安全性的重要步骤. Vue CLI 是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能.本文将介绍如何使用 ...

  6. MongoDB 副本模式,会映射到本地 127.0.0.1 错误

    基于 MongoDB 读写分离--Windows MongoDB 副本集配置 ,里面配置了一个坑,导致出现下列错误 [2021-05-10 10:06:11.981] [cluster-Cluster ...

  7. [计数dp] 整数划分(模板题+计数dp+完全背包变种题)

    计数类 dp 可分为 计数 dp 和数位统计 dp.大多是用来统计方案数什么的,特别强调 不重不漏,在此还是根据各个题的特点将计数 dp 和数位 dp 分开整理.其实数位 dp 的题目会相对多很多- ...

  8. Hystrix 如何解决 ThreadLocal 信息丢失

    本文分享 ThreadLocal 遇到 Hystrix 时上下文信息传递的方案. 一.背景 笔者在业务开发中涉及到使用 ThreadLocal 来存放上下文链路中一些关键信息,其中一些业务实现对外部接 ...

  9. 2023 中国 Serverless 用户调查,邀您填写!

    当前云计算已成为数字时代的基础设施,支撑众多企业进行数字化转型升级.随着企业上云的范围更加广泛,国内云计算正在迈向云原生时代.Serverless技术因其以应用为中心.屏蔽底层复杂逻辑,灵活扩展,按需 ...

  10. 从“预见”到“遇见”SAE 引领应用步入 Serverless 全托管新时代

    --黛忻 阿里云SAE产品经理 近年来,企业的数字化随着互联网的普及发展越来越快,技术架构也是几经更迭,尤其是在线业务部分.从最初的单体应用到分布式应用再到云原生应用,出现了进阶式的变化. 带来便利的 ...