首页 > 其他分享 >gdb学习

gdb学习

时间:2024-02-07 14:44:42浏览次数:27  
标签:变量 disassemble stl 打印 gdb 学习 地址

变量打印方式
p/t    variable_name 以二进制打印变量
p/t    variable_addr 以二进制打印地址内容
p/a    能够以指针的方式输出变量


使用 x 命令可以将指定内存地址中的内容打印出来

命令语法:x/nfu
n    用于指定打印的数量
u    用于指定每个打印变量的长度:b(byte)一个字节,h(half-word)两个字节,w(word)四个字节,g(giant word)八个字节
f    用于指定打印的格式 可取如下值
x    按十六进制格式显示变量。
d    按十进制格式显示变量。
u    按十进制格式显示无符号整型。
o    按八进制格式显示变量。
t    按二进制格式显示变量。
a    按十六进制格式显示变量。
i    指令地址格式
c    按字符格式显示变量。
f    按浮点数格式显示变量。


gdb一些简单的命令

start            //开始调试
n              //一条一条执行
step/s           //跟n不同的是,如果是函数,会进入函数
backtrace/bt        //查看函数调用栈帧
info/i locals         //查看当前栈帧局部变量
frame/f          //选择栈帧,再查看局部变量
print/p          //打印变量的值
finish           //运行到当前函数返回
set var sum=0       //修改变量值
list/l 行号或函数名     //列出源码
display/undisplay sum   //每次停下显示变量的值/取消跟踪
break/b 行号或函数名   //设置断点
continue/c        //连续运行
info/i breakpoints     //查看已经设置的断点
delete breakpoints 2   //删除某个断点
disable/enable breakpoints 3 //禁用/启用某个断点
break 9 if sum != 0    //满足条件才激活断点
run/r           //重新从程序开头连续执行
watch input[4]      //设置观察点
info/i watchpoints    //查看设置的观察点
input          //打印存储器内容,b–每个字节一组,7–7组
disassemble      //反汇编当前函数或指定函数
si           // 一条指令一条指令调试 而 s 是一行一行代码
info registers     // 显示所有寄存器的当前值
x/20 $esp       //查看内存中开始的20个数
set print pretty on   //让gdb打印变量一行一行的显示,而不是一堆
set print elements 0  //打印字符无限制

 


gdb调试循环
假设我想查看低70次循环
for(i = 0;i < 100; i++)
watich i           监视i变量
ignore i 70         设置忽略对i的70次监视
c             跳转至第70次循环


gdb信号处理
handle SIGUSR1 nostop noprint


gdb地址调试
比如打印wstring


获取str3的地址


获取str3的大小


以十进制打印地址


拼接地址,分别为 03 77 a2 b8 拼接后为0x377a2b8


gdb汇编调试
disassemble可以展开断点函数的汇编
disassemble 地址
disassemble 函数声明
disassemble 开始地址, 结束地址
disassemble 地址加字节数
disassemble 函数声明加字节数
disassemble /m 地址或者函数声明         反汇编命令将显示与反汇编指令相对应的源代码行
disassemble /r 地址或者函数声明         显示所有反汇编指令的原始字节值
info r                      查看寄存器信息
set disassemble-next-line on           显示下一条要执行的汇编代码
si                       执行以下一步汇编
b *main+12                   在某处汇编地址断点,只能从函数声明处,通过地址偏移实现。例如

 


gdb后台调试
用gdb --command=filename命令,将gdb调试命令预先存储在filename命令中
例如新建文件gdb_crash文件,里面内容如下(程序收到崩溃信号以后,打印堆栈)
handle SIGABRT stop print
handle SIGFPE stop print
handle SIGSEGV stop print
handle SIGPIPE nostop noprint
c
set logging file gdb_bt.txt
set logging on
thread apply all bt
set logging off
q
y

使用命令,就可以将gdb挂在后台,一直等待信号
nohup gdb -p 程序pid --command=gdb_crash&


只运行当前线程
set scheduler-locking on


gcc发现编译出来的程序无法调试
使用其他版本的编译 -gdwarf-3 -gdwarf-1 -gdwarf-2 -gdwarf-4


gdb利用python扩展打印stl容器变量
首先需要获取对应的python扩展
可以直接下载(地址不一定有效)
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc+±v3/python


也可以从gcc源码中拉出来
gcc-4.8.1/libstdc+±v3/python


在linux家目录下创建一份.gdbinit文件,内容很简单,如下(/usr/share/gcc-9.3.0/python是自己的目录存放地址)
python
import sys
sys.path.insert(0, ‘/usr/share/gcc-9.3.0/python’) # python目录
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

然后启动gdb就自动加载了

利用stl-views-1.0.3.gdb打印stl容器

个人感觉,这个没有python扩展好用
stl-views-1.0.3.gdb扩展下载地址忘了网上直接搜索就好

 

gdb附加后执行
source stl-views-1.0.3.gdb

打印vector
pvector 变量 stl类型

打印set
pset 变量 stl类型

打印map
pmap 变量 stl类型1 stl类型2

其他的stl打印方式自己研究吧


硬打vector中的数据
p *(vt._M_impl._M_start)@1
vt, 容器名字
1,第几个元素,从1开始

标签:变量,disassemble,stl,打印,gdb,学习,地址
From: https://www.cnblogs.com/ccxk-accumulate/p/18010908

相关文章

  • 中科院深圳先进院提出 SBeA,基于少样本学习框架进行动物社会行为分析
    鸟儿舒展羽翼,狼群拥护在头狼的身边,企鹅共同抚育后代……动物的社会行为背后都有着什么样的含义?繁殖、捕食、防御、建立社会等级的递进,是否揭示了人类一步步进化的过程?这些问题的研究被称为动物社会行为研究(animalsocialbehaviour),该研究精确量化、身份识别和行为分类的特性,有......
  • Java学习的知识笔记
    不会改变原始对象的方法reverse函数,作用:排序使用小技巧判断string是否相等可以使用equals来进行判断。判断string是否是空字符串可以用isBlank()进行判断对于超大的整数加减使用对应的函数进行操作,比如加,使用add函数参考bignum.java因为math类的构造方法是private修饰,所以......
  • postman 学习第6天
    配置请求参数在Postman中,你可以配置请求的参数,例如URL参数、请求头和请求体。了解如何正确配置这些参数对于发送有效的API请求非常重要。你可以使用Postman的参数化请求功能,以便在测试或实际使用时动态地插入参数。使用Postman的认证和授权机制API通常需要认证和授权才能访问。在Po......
  • Linux下gdb如何调试coredump文件
    目录简介示例简介在Linux下,你可以使用GNU调试器(GDB)来调试coredump文件。Coredump文件是在程序崩溃时由操作系统生成的,它包含了程序崩溃时的内存内容、寄存器状态和其他相关信息。下面是在Linux下使用GDB调试coredump文件的步骤:确保你的系统已经安装了GDB。如果没有安装,你......
  • 使用kubeadm部署kubernetes1.23(学习使用)
    注释:此次操作使用VMwareWorkstationPro17虚拟机进行本次使用单master节点,双worker节点组成的最小化单主节点的学习环境1.K8S所有节点环境准备xshell发送所用会话,包括harbor仓库虚拟机操作系统环境准备参考链接:https://kubernetes.io/zh/docs/setup/production-environmen......
  • [Ngbatis源码学习] Ngbatis 源码学习之资源加载器 DaoResourceLoader
    Ngbatis源码阅读之资源加载器DaoResourceLoaderDaoResourceLoader是Ngbatis的资源文件加载器,扩展自MapperResourceLoader。本篇文章主要分析这两个类。1.相关类MapperResourceLoaderDaoResourceLoader2.MapperResourceLoader在介绍DaoResourceLoader之前有必要......
  • 软件测试学习笔记丨nmon 工具简介与使用
    nmon简介nmon是一种可以在AIX与Linux操作系统上使用的性能监控与分析工具使用技巧:下载位置:http://nmon.sourceforge.net ,从Binaries中下载可执行程序包解压之后选择使用所在操作系统对应的可执行程序可以使用ln命令将nmon程序软链接添加到/urs/bin目录下,这样可以通......
  • 软件测试学习笔记丨性能分析系统级别指标 io cpu mem net
    io指标监控命令iostat命令描述:监控系统设备的IO负载情况命令演示:iostatio指标监控命令df命令描述:列出⽂件系统的整体磁盘空间使⽤情况命令演示:df-hcpu指标监控命令uptime命令描述:用于显示系统总共运行了多长时间和系统的平均负载命令演示:uptimecpu指标监控命令cat/......
  • 软件测试学习笔记丨Web端测试——测试用例设计思路
    一、UI测试界面风格统一,与UI设计原型图一致界面文案正确提示、警告或错误说明描述准确切换窗口大小,将窗口缩小后,页面是否按比例缩小或出现滚动条,页面是否正确显示所有的图片是否都被正确装载在不同的浏览器、分辨率下图片是否能正确显示二、搜索测试如果支持模糊查询,搜索名称中......
  • iTextPdf学习笔记
    ITextPdf官网地址:https://itextpdf.com/html转pdf演示:https://itextpdf.com/demos/convert-html-css-to-pdf-free-onlineGithub地址:https://github.com/itext/itext7介绍iText是一个用于处理PDF文档的Java库。它提供了丰富的功能,帮助开发人员创建、编辑和处理PDF文档,......