[转帖]gdb 常用命令
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 常用命令的更多相关文章
- Linux GDB常用命令一栏
Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明: (*** 表示可执行程序名) (2)退出:quit.有的时候输入quit后会出现相关提示:类似 ...
- gdb常用命令记录
gdb常用命令 最近在研究nginx源码,gdb用于调试非常方便,之前这篇有研究过如何使用gdb调试nginx:https://www.cnblogs.com/yjf512/archive/2012/ ...
- GDB常用命令系列
本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/gdb_instructions.html 本文为索引,请点击以下链接进行阅读: GDB调试原理——p ...
- GDB常用命令使用说明(一)
本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/gdb_instructions1.html 全部关于gdb的文章索引请点这里 GDB(GNU Deb ...
- gdb 常用命令总结(精优)
格式说明: [xxx]:可选参数,即可以指定可以不指定,实际输入的内容是 xxx <xxx>:占位参数,即必须指定的参数,实际输入的内容是 xxx gdb 常用命令: gdb [file] ...
- C 调试 gdb常用命令
gdb常用命令: [root@redhat home]#gdb 调试文件:启动gdb (gdb) l :(字母l)从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) b ...
- Linux调试工具strace和gdb常用命令小结
strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...
- 第04课:GDB常用命令详解(上)
本课的核心内容如下: run命令 continue命令 break命令 backtrace与frame命令 info break.enable.disable和delete命令 list命令 prin ...
- 第07课:GDB 常用命令详解(下)
本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 disassemble 命令 当进行一些高级 ...
- 第06课:GDB 常用命令详解(中)
本课的核心内容: info 和 thread 命令 next.step.util.finish.return 和 jump 命令 info 和 thread 命令 在前面使用 info break 命 ...
随机推荐
- CUDA C编程权威指南:1.3-CUDA基础知识点梳理
主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的. 1.CUDA数组 解析:CUDA数组 ...
- C++篇:第十一章_标准库_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十一.标准库 include头文件: ① 一般来说,导入objective c的 ...
- 解读登录双因子认证(MFA)特性背后的TOTP原理
摘要:随着互联网密码泄露事件频发,越来越多的产品开始支持多因子认证(MFA),TOTP则是MFA领域里最普遍的一种实现方式,本文介绍TOTP的原理和华为云的实践经验. 原理 TOTP(Time-Bas ...
- 火山引擎ByteHouse:如何用OLAP引擎提升数字营销效果?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着市场竞争的加剧,企业对数字营销投入的效果监测和优化需求日益增强,营销实时监控也成为企业提升运营效率的重要手 ...
- 将镜像上传到Docker Hub中央仓库中
首先创建一个镜像,点击:创建一个简单的Docker镜像 1.先注册帐号 https://hub.docker.com/ 2.将镜象推上去 [root@localhost docker]# docker ...
- Hugging News #0925: 一览近期的新功能发布
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- nginx: [emerg] unknown directive "?server" in /etc/nginx/conf.d/nginx.conf:1
问题描述:启动nginx的时候报错 1.nginx: [warn] the "user" directive makes sense only if the master proc ...
- 阿里云的“终端云化”实践,基于ENS进行边缘架构构建
终端无休止的更新迭代,是软件对计算资源的需求激增. 作者|王广芳 编辑|IMMENSE 终端云化:打破硬件的桎梏 近几年,"终端云化"技术开始规模化落地,其核心思想是"计 ...
- 在Winform系统开发中,对表格列表中的内容进行分组展示
在我们开发Winform界面的时候,有时候会遇到需要对一些字段进行一些汇总的管理,如果在列表中能够对表格列表中的内容进行分组展示,将比较符合我们的预期,本篇随笔介绍在Winform开发中如何利用Dev ...
- 二、docker的安装和镜像管理
系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...