聊一聊 GDB 调试程序时的几个实用命令
一:背景
1. 讲故事
用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯,不习惯在于想用的命令或者面板找不到,总的来说还是各有千秋吧,今天我们来聊一下几个在调试中比较实用的命令:
- 查看内存
- 硬件断点
- 虚拟内存布局
二:命令解读
1. 查看内存
相信大家都知道 Visual Studio 直接提供了 Memory 面板来观察内存布局,但 VSCode 没有,还需要自己手敲命令来实现,这就比较麻烦了,为了方便先上一段测试代码。
#include <iostream>using namespace std;int main()
{int a = 10;int b = 11;int c = 12;
}
调试器配的是 GDB,只能用它的 x 命令观察内存,类似 WinDbg 的 d系列命令,我们在 int c=12
处下个断点,命中后使用 -exec x/40xw $esp
观察 esp处的内存块,截图如下:
这里的 x/40xw $esp
是什么意思呢? 翻译成 WinDbg 的术语就是 dd esp L40
的意思,也就是显示 40 个 dword 指针单元的内存地址。
从内存地址上看 a,b 都存放在线程栈上,虽然没有 VS 便捷,但还是可以用的。
2. 硬件断点
说实话到现在都没搞明白为什么 Visual Studio 不支持硬件断点,其实是可以做的,熟悉 WinDbg 的朋友都知道有一个 ba
命令就是专门用来设置硬件断点,硬件断点牛的地方在于可以对 内存地址
的读写进行监控,不过它需要 CPU
的调试寄存器支持,即 dr0 ~ dr7
。
比如我在 windbg 中对 04ee5000
下一个读断点,输出如下:
eax=04ee5000 ebx=00000000 ecx=7746dfe0 edx=10088020 esi=7746dfe0 edi=7746dfe0
eip=77434e50 esp=0897f804 ebp=0897f830 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!DbgBreakPoint:
77434e50 cc int 30:014> ba r4 04ee5000
0:014> g
0:014> r dr0
dr0=04ee5000
在 GDB 中也有类似的 硬件断点
,即 rwatch
和 awatch
命令,前者用来监视读操作
,后者监视 读写操作
,这里我们测试下 awatch
命令,测试代码如下:
int main()
{int a = 10;int b = 11;a = 15;int c = 12;
}
接下来在 int b=11
处下断点,通过 x 命令找到 a
所在的内存地址,然后使用 awatch
进行监控,不过有点坑的是 awatch
需要转成具体类型,相当于监视的范围宽度,输出如下:
-exec x/10x $esp+0x4
0xffffd11c: 0x0000000a 0xf7dd4000 0xf7dd4000 0x00000000
0xffffd12c: 0xf7c06ed5 0x00000001 0xffffd1c4 0xffffd1cc
0xffffd13c: 0xffffd154 0xf7dd4000
-exec awatch 0xffffd11c
Cannot watch constant value `0xffffd11c'.
-exec awatch *(int*)0xffffd11c
Hardware access (read/write) watchpoint 3: *(int*)0xffffd11c
-exec c
Continuing.Hardware access (read/write) watchpoint 3: *(int*)0xffffd11cOld value = 10
New value = 15
main () at /home/skyfly/code/main.cpp:12
12 int c = 12;
从上面输出的信息看非常明确,也非常有意思,给 GDB 点一个赞。
3. 虚拟地址布局
这个貌似也是 VS 不具有的功能,在 GDB 中得到了支持,相当于 WinDBG 中的 !address
命令,观察虚拟地址布局
好处多多,可以看到内存的分配情况,比如 stack 是否溢出就能从中观察得到,在 GDB 中可以使用 i proc mapping
命令,输出如下:
-exec i proc mapping
process 5142
Mapped address spaces:Start Addr End Addr Size Offset objfile0x56555000 0x56556000 0x1000 0x0 /home/skyfly/code/main.out0x56556000 0x56557000 0x1000 0x1000 /home/skyfly/code/main.out0x56557000 0x56558000 0x1000 0x2000 /home/skyfly/code/main.out0x56558000 0x56559000 0x1000 0x2000 /home/skyfly/code/main.out0x56559000 0x5655a000 0x1000 0x3000 /home/skyfly/code/main.out0x5655a000 0x5657c000 0x22000 0x0 [heap]0xf7ac7000 0xf7ac9000 0x2000 0x0 0xf7ac9000 0xf7acb000 0x2000 0x0 /usr/lib32/libgcc_s.so.10xf7acb000 0xf7ae1000 0x16000 0x2000 /usr/lib32/libgcc_s.so.10xf7ae1000 0xf7ae6000 0x5000 0x18000 /usr/lib32/libgcc_s.so.10xf7ae6000 0xf7ae7000 0x1000 0x1c000 /usr/lib32/libgcc_s.so.10xf7ae7000 0xf7ae8000 0x1000 0x1d000 /usr/lib32/libgcc_s.so.10xf7ae8000 0xf7af2000 0xa000 0x0 /usr/lib32/libm-2.31.so0xf7af2000 0xf7bb3000 0xc1000 0xa000 /usr/lib32/libm-2.31.so0xf7bb3000 0xf7bea000 0x37000 0xcb000 /usr/lib32/libm-2.31.so0xf7bea000 0xf7beb000 0x1000 0x101000 /usr/lib32/libm-2.31.so0xf7beb000 0xf7bec000 0x1000 0x102000 /usr/lib32/libm-2.31.so0xf7bec000 0xf7c05000 0x19000 0x0 /usr/lib32/libc-2.31.so0xf7c05000 0xf7d5d000 0x158000 0x19000 /usr/lib32/libc-2.31.so0xf7d5d000 0xf7dd1000 0x74000 0x171000 /usr/lib32/libc-2.31.so0xf7dd1000 0xf7dd2000 0x1000 0x1e5000 /usr/lib32/libc-2.31.so0xf7dd2000 0xf7dd4000 0x2000 0x1e5000 /usr/lib32/libc-2.31.so0xf7dd4000 0xf7dd5000 0x1000 0x1e7000 /usr/lib32/libc-2.31.so0xf7dd5000 0xf7dd8000 0x3000 0x0 0xf7dd8000 0xf7e4d000 0x75000 0x0 /usr/lib32/libstdc++.so.6.0.280xf7e4d000 0xf7f4f000 0x102000 0x75000 /usr/lib32/libstdc++.so.6.0.280xf7f4f000 0xf7fad000 0x5e000 0x177000 /usr/lib32/libstdc++.so.6.0.280xf7fad000 0xf7fb3000 0x6000 0x1d4000 /usr/lib32/libstdc++.so.6.0.280xf7fb3000 0xf7fb5000 0x2000 0x1da000 /usr/lib32/libstdc++.so.6.0.280xf7fb5000 0xf7fb7000 0x2000 0x0 0xf7fc9000 0xf7fcb000 0x2000 0x0 0xf7fcb000 0xf7fcf000 0x4000 0x0 [vvar]0xf7fcf000 0xf7fd1000 0x2000 0x0 [vdso]0xf7fd1000 0xf7fd2000 0x1000 0x0 /usr/lib32/ld-2.31.so0xf7fd2000 0xf7ff0000 0x1e000 0x1000 /usr/lib32/ld-2.31.so0xf7ff0000 0xf7ffb000 0xb000 0x1f000 /usr/lib32/ld-2.31.so0xf7ffc000 0xf7ffd000 0x1000 0x2a000 /usr/lib32/ld-2.31.so0xf7ffd000 0xf7ffe000 0x1000 0x2b000 /usr/lib32/ld-2.31.so0xfffdd000 0xffffe000 0x21000 0x0 [stack]
从输出看,当前的 stack 布局段在 0xfffdd000 ~ 0xffffe000
之间,如果发生了栈溢出就可以看下是不是超过这个范围了哈,除了 stack 还可以看到 heap 的段范围 0x5655a000 ~ 0x5657c000
。
三:总结
GDB 有很多实用的命令这里就不逐一介绍了,至少在 Linux 上是霸主一样的存在,真搞不懂 netcore 的调试要和 lldb 扯在一块,简直是不走寻常路哈 😂😂😂
相关文章:
聊一聊 GDB 调试程序时的几个实用命令
一:背景 1. 讲故事 用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯,不习惯在于想用的命令或者面板找不到,总的来说还是各有千秋吧,今天我们来聊一下几个在调试中比较实用的命令: 查看内存硬件…...
MySQL驱动对MYSQL进行update操作时返回值注意UseAffectedRows
数据库upate更新表时经常要用,update的结果进行一些逻辑判断,如返回值大于1表示更新成功,为0表示更新失败。 但是使用Mysql驱动连接数据库并进行update操作时,返回值可能不在预期。 update iwrs_drug_order set status2 where …...
OpenCV-Python图像几何变换
概念:几何变换是指将一幅图像映射到另外一幅图像内的操作。OpenCV提供了多个与映射有关的函数,这些函数使用起来方便灵活,能够高效地完成图像的映射。 缩放 cv2.resize()函数用于缩放图像 det cv2.resize(src, dsize[,dst[,fx[,fy[,interp…...
国民技术N32G430开发笔记(15)- IAP升级 树莓派串口发送数据
IAP升级 树莓派串口发送数据 1、树莓派接入usb转串口模块后,会生成/dev/ttyUSB0节点,因为树莓派内核已经编译usb_serial以及各模块的驱动。 我们直接对ttyUSB0节点编程即可。 2、协议同上一节 cmd data_lenght data0 … datax checksum 1、获取版本…...
svo论文解读
SVO: Semi-Direct Visual Odometry for Monocular and Multi-Camera Systems 2016TRO MOTION ESTIMATION 1 Sparse Image Alignment 从上一帧的特征投影到当前帧,最小化重投影误差计算帧间位姿(patch44) 2 Relaxation Through Feature Alig…...
DolphinScheduler海豚调度教程
DolphinScheduler 教程 (一)入门指南 简介 关于Dolphin Apache DolphinScheduler是一个分布式易扩展的可视化DAG工作流任务调度开源系统。解决数据研发ETL 错综复杂的依赖关系,不能直观监控任务健康状态等问题。DolphinScheduler以DAG流式…...
ubuntu脚本解释器踩坑:#!/bin/bash 与 #!/bin/sh
前言: 博主正在写linux的脚本的时候遇到:xx.sh: 3: Syntax error: "(" unexpected 查看shell脚本语法没有问题,后面发现是解释器的原因。 一、不同的解释器 #!是特殊的表示符,其后面根的是此解释此脚本的shell的路径…...
小松鼠踩一踩游戏
文章目录 一、 介绍和知识点九、UnityFacade 门面设计模式二、 声音全局管理器测试音频代码UI全局管理器父类抽象类 BaseManager子类 UIManager 四、 UI按钮的引用父类 BasePanel子类主面板 MainPanel子类 游戏中 GamePanel子类 游戏结果 ResultPanel 角色动画器、控制角色移动…...
使用crontab命令同步时间
crontab命令可以用于在Linux系统中定期同步时间。常用的时间同步方法有: 1. 使用ntpdate同步时间 可以添加如下crontab任务: */5 * * * * /usr/sbin/ntpdate time.nist.gov http://xn–5time-rg2hnkqin4vhsb6x8meq6d7yxa.nist.gov/ NTP服务器同步一次时间。 2. 使用ntpd作为…...
TortoiseGit提示No supported authentication methods available异常
TortoiseGit他属于git的客户端,可有可无,说白了就是将git命令给我们整理成了可直接操作的按钮。 本地代码是使用了SSH的方式去拉取的代码,但是通过TortoiseGit pull代码的时候发生了如下异常,而GitBash却可以正常使用。 TortoiseG…...
基于哈希表的用户管理系统
三大模块: - 哈希表模块 哈希函数 哈希表创建 哈希表销毁 - 用户管理模块 显示 增 删 改 查 - 文件模块 从文件导入用户信息 将用户信息导出至文件 1.哈希函数 //hash函数(质数除余法) int Hash_Fun1(data_type key){int pos key%P;…...
GO数组切片-线性数据结构
数据结构 类型 什么是类型 ? 内存中的二进制数据本身没有什么区别,就是一串0或1的组合。 内存中有一个字节内容是0x63,他究竟是深恶 字符串?字符?还是整数? 本来0x63表示数字 但是文字必须编码成为0和1的组合 才能记…...
C++ STL学习之【优先级队列】
✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 🌇前言🏙️正文1、优先级队列的使用1.1、基本功能1.2、优先级模式切换1.3、相关题目 2、模拟…...
keepalived脑裂现象
Keepealived最常见的问题是会出现脑裂现象: Master一直发送心跳消息给backup主机,如果中间的链路突然断掉,backup主机将无法收到master主机发送过来的心跳消息(也就是vrrp报文),backup这时候会立即抢占mas…...
[stable-diffusion-art] 指北-1
https://stable-diffusion-art.com/beginners-guide/https://stable-diffusion-art.com/beginners-guide/ Stable Diffusion教程目录 - 知乎按: 这个外国教程站中的文章太好了,数量适当,质量很高可惜博文只能按时间浏览,所以整理…...
「C/C++」C/C++预处理器
博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录 一、宏替换 #define1. 定义常量2. 定义函数3. 定义代码块 二、条件编译 #if1. 使用 #ifdef、 #else 和 #endif2. 使用 #if 、#elif、#else和 #endif 编译不同版本的代码3. 使用 #ifndef 和 #def…...
java语言入门教程文章
好的,以下是Java语言入门教程: Java是一种高级编程语言,由Sun Microsystems于1995年推出。Java语言具有良好的可移植性和安全性,因此被广泛应用于Web应用程序、移动应用程序、企业应用程序等各个领域。本教程将带领初学者快速入门…...
基于灰狼算法的极限学习机(ELM)回归预测-附代码
基于灰狼算法的极限学习机(ELM)回归预测 文章目录 基于灰狼算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于灰狼算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要:本文利用灰狼算法对极限学习机进行优化,并…...
【五一创作】ERP实施-委外业务-委外采购业务
委外业务主要有两种业务形态:委外采购和工序外协,委外采购主要是在MM模块中实现,工序外协主要由PP模块实现,工序外协中的采购订单创建和采购收货由MM模块实现。 委外采购概念 委外采购,有些企业也称为带料委外或者分包…...
DAY 54 数据库基础
数据库的基本概念 数据(Data): 描述事务的符号记录包括数字、文字、图形、图像、声音、档案记录以”记录“形式按统一的格式进行存储 表: 将不同的记录组织在一起用来存储具体数据 数据库: 表的集合,…...
网络编程 总结二
一、TCP TCP模型 1. TCP搭建相关函数: 套接字Socket 1)Socket函数: 2)bind 3)listen 4)accept 5)recv 注意: 1> TCP中的recv 可以替换成read; 2>TCP中的…...
消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务
根据国外科技媒体 iMore 报道,基于消息源 analyst941 透露的信息,苹果公司目前并未开发 MFi 限制。 根据推文信息内容,两款 iPhone 15 机型的最高充电功率为 20W,而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…...
设计模式——工厂模式(简单工厂、工厂方法、抽象工厂)
是什么? 工厂模式的目的是将创建对象的具体过程隐藏起来,从而达到更高的灵活性 工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式; 为什么? 在Java中,万物皆是对象,我们在使用的时候…...
《C语言技术体系》 学习路线总目录 + 思维导图
目录 前言 正文 思维导图 第1章 流程结构 1.1 初识C语言 1.2 流程结构 1.3 数据类型 1.4 运算符表达式 第2章 指针与数组 2.1 指针基本概念 2.2 一维数组 2.3 二维及多维数组 2.4 指针与数组 第3章 模块化重构 3.1 函数 3.2 typedef类型定义 3.3 enum枚举 3.…...
数字图像处理简答题
目录 1.人类视觉对颜色的主观感觉包括哪三类? 2. 图像成像的过程包括哪三步? 3.图像的采样和量化分别指什么? 4、取k8时,将下图用相应矩阵表示 5、简述当限定了数字图像的数据量时采样和量化参数的选择遵循哪两条原则&#x…...
【Java校招面试】基础知识(五)——GC
目录 前言一、基础概念二、垃圾回收算法三、垃圾收集器四、引用后记 前言 本篇主要介绍Java垃圾回收机制——GC的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第五篇博文,如有需要,可: 点击这里,返回本专…...
使用CMake调用Makefile 项目
目录标题 基本示例Cmake传递lib给MakefileCmake传递参数给Makefile,比如make cleanWindows下使用Cmake调用Makefile 基本示例 如果项目是使用传统的Makefile构建的,并且您希望使用CMake调用这些Makefile,您可以使用CMake的add_custom_target…...
快速傅里叶变换FFT学习笔记
点值表示法 我们正常表示一个多项式的方式,形如 A ( x ) a 0 a 1 x a 2 x 2 . . . a n x n A(x)a_0a_1xa_2x^2...a_nx^n A(x)a0a1xa2x2...anxn,这是正常人容易看懂的,但是,我们还有一种表示法。 我们知道…...
如何下载安装驱动
1 打开浏览器 这里以Edge浏览器举例 第一步打开桌面上的Edge浏览器 如果您的桌面上没有 那么找到搜索栏 搜索Edge 然后打开 打开之后一般是这样 然后把我发送您的地址 驱动下载地址 https://t.lenovo.com.cn/yfeyfYyD (这个网址只是一个例子) 删除掉前…...
鸿蒙Hi3861学习四-Huawei LiteOS介绍
一、什么是LitesOS Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力。基于物联网领域业务特征打造领域性技术栈,为开发者提供“一…...
广州疫情 高位平台/安卓优化大师2021
当用浏览器浏览网页的时候,当我们点击一个连接的时候,浏览器就会转到新的页面去。整个过程如下: 1)用户在当前页面点击->2)浏览器获取新的URL->3)浏览器转到新的URL。现在,假设我们有一个pdf的阅读程…...
网站建设整体策划/网络怎么做推广
之前我们介绍的cookie是把用户的身份信息存在了客户端,而session说白了就是把用户的信息保存在了服务端。由于session是保存在了服务端,所以当用户关闭浏览器时session并不会消失。一般session保存在服务器的内存中当然也可以持久化到硬盘或者数据库中。…...
wordpress 热门排行/百度seo优化包含哪几项
在spring的配置文件中配置的bean,spring会进行依赖注入和初始化对象。 根据配置不同,spring会选择不同的代理方式。对于JDK动态代理、cglib动态代理,spring会找到目标接口的实现类并初始化一个对象,对于Dubbo的consumerÿ…...
网站负责人彩色验照/汕头seo公司
三、网络属性设置(如果你只有一台电脑,且外网IP就在服务器上,不做局域网主机的话,那么将不进行这个操作)要使用以上所述服务,本机必须要有静态(即固定)的IP地址。如果只是在局域网中使用&#x…...
企业宣传片制作公司天津/什么是搜索引擎优化推广
点击上方关注我们!11月15日,由亚信安全主办的“安全世界 5正当时”2020第五空间战略发展高峰论坛在北京盛大举行。来自政府、运营商、金融和能源等关键信息基础设施行业的负责人,生态合作伙伴出席本次活动,“共启安全数字世界”,聚…...
书店网站规划与建设/网站建设的步骤
又一次过了零点,不得不说晚上的时间过的实在太快,跟前几天通宵排队时的煎熬形成鲜明对比,为了保存实力,今天到此为止,带着问题明天再继续排查。 凌晨让叫车也变得容易,在走出办公室时就有人接单了ÿ…...