当前位置: 首页 > news >正文

聊一聊 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 中也有类似的 硬件断点,即 rwatchawatch 命令,前者用来监视读操作,后者监视 读写操作,这里我们测试下 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 调试程序时的几个实用命令

一&#xff1a;背景 1. 讲故事 用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯&#xff0c;不习惯在于想用的命令或者面板找不到&#xff0c;总的来说还是各有千秋吧&#xff0c;今天我们来聊一下几个在调试中比较实用的命令&#xff1a; 查看内存硬件…...

MySQL驱动对MYSQL进行update操作时返回值注意UseAffectedRows

数据库upate更新表时经常要用&#xff0c;update的结果进行一些逻辑判断&#xff0c;如返回值大于1表示更新成功&#xff0c;为0表示更新失败。 但是使用Mysql驱动连接数据库并进行update操作时&#xff0c;返回值可能不在预期。 update iwrs_drug_order set status2 where …...

OpenCV-Python图像几何变换

概念&#xff1a;几何变换是指将一幅图像映射到另外一幅图像内的操作。OpenCV提供了多个与映射有关的函数&#xff0c;这些函数使用起来方便灵活&#xff0c;能够高效地完成图像的映射。 缩放 cv2.resize()函数用于缩放图像 det cv2.resize(src, dsize[,dst[,fx[,fy[,interp…...

国民技术N32G430开发笔记(15)- IAP升级 树莓派串口发送数据

IAP升级 树莓派串口发送数据 1、树莓派接入usb转串口模块后&#xff0c;会生成/dev/ttyUSB0节点&#xff0c;因为树莓派内核已经编译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 从上一帧的特征投影到当前帧&#xff0c;最小化重投影误差计算帧间位姿&#xff08;patch44&#xff09; 2 Relaxation Through Feature Alig…...

DolphinScheduler海豚调度教程

DolphinScheduler 教程 &#xff08;一&#xff09;入门指南 简介 关于Dolphin Apache DolphinScheduler是一个分布式易扩展的可视化DAG工作流任务调度开源系统。解决数据研发ETL 错综复杂的依赖关系&#xff0c;不能直观监控任务健康状态等问题。DolphinScheduler以DAG流式…...

ubuntu脚本解释器踩坑:#!/bin/bash 与 #!/bin/sh

前言&#xff1a; 博主正在写linux的脚本的时候遇到&#xff1a;xx.sh: 3: Syntax error: "(" unexpected 查看shell脚本语法没有问题&#xff0c;后面发现是解释器的原因。 一、不同的解释器 #!是特殊的表示符&#xff0c;其后面根的是此解释此脚本的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的客户端&#xff0c;可有可无&#xff0c;说白了就是将git命令给我们整理成了可直接操作的按钮。 本地代码是使用了SSH的方式去拉取的代码&#xff0c;但是通过TortoiseGit pull代码的时候发生了如下异常&#xff0c;而GitBash却可以正常使用。 TortoiseG…...

基于哈希表的用户管理系统

三大模块&#xff1a; - 哈希表模块 哈希函数 哈希表创建 哈希表销毁 - 用户管理模块 显示 增 删 改 查 - 文件模块 从文件导入用户信息 将用户信息导出至文件 1.哈希函数 //hash函数&#xff08;质数除余法&#xff09; int Hash_Fun1(data_type key){int pos key%P;…...

GO数组切片-线性数据结构

数据结构 类型 什么是类型 &#xff1f; 内存中的二进制数据本身没有什么区别&#xff0c;就是一串0或1的组合。 内存中有一个字节内容是0x63&#xff0c;他究竟是深恶 字符串?字符&#xff1f;还是整数&#xff1f; 本来0x63表示数字 但是文字必须编码成为0和1的组合 才能记…...

C++ STL学习之【优先级队列】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、优先级队列的使用1.1、基本功能1.2、优先级模式切换1.3、相关题目 2、模拟…...

keepalived脑裂现象

Keepealived最常见的问题是会出现脑裂现象&#xff1a; Master一直发送心跳消息给backup主机&#xff0c;如果中间的链路突然断掉&#xff0c;backup主机将无法收到master主机发送过来的心跳消息&#xff08;也就是vrrp报文&#xff09;&#xff0c;backup这时候会立即抢占mas…...

[stable-diffusion-art] 指北-1

https://stable-diffusion-art.com/beginners-guide/https://stable-diffusion-art.com/beginners-guide/ Stable Diffusion教程目录 - 知乎按&#xff1a; 这个外国教程站中的文章太好了&#xff0c;数量适当&#xff0c;质量很高可惜博文只能按时间浏览&#xff0c;所以整理…...

「C/C++」C/C++预处理器

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录 一、宏替换 #define1. 定义常量2. 定义函数3. 定义代码块 二、条件编译 #if1. 使用 #ifdef、 #else 和 #endif2. 使用 #if 、#elif、#else和 #endif 编译不同版本的代码3. 使用 #ifndef 和 #def…...

java语言入门教程文章

好的&#xff0c;以下是Java语言入门教程&#xff1a; Java是一种高级编程语言&#xff0c;由Sun Microsystems于1995年推出。Java语言具有良好的可移植性和安全性&#xff0c;因此被广泛应用于Web应用程序、移动应用程序、企业应用程序等各个领域。本教程将带领初学者快速入门…...

基于灰狼算法的极限学习机(ELM)回归预测-附代码

基于灰狼算法的极限学习机(ELM)回归预测 文章目录 基于灰狼算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于灰狼算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;本文利用灰狼算法对极限学习机进行优化&#xff0c;并…...

【五一创作】ERP实施-委外业务-委外采购业务

委外业务主要有两种业务形态&#xff1a;委外采购和工序外协&#xff0c;委外采购主要是在MM模块中实现&#xff0c;工序外协主要由PP模块实现&#xff0c;工序外协中的采购订单创建和采购收货由MM模块实现。 委外采购概念 委外采购&#xff0c;有些企业也称为带料委外或者分包…...

DAY 54 数据库基础

数据库的基本概念 数据&#xff08;Data&#xff09;&#xff1a; 描述事务的符号记录包括数字、文字、图形、图像、声音、档案记录以”记录“形式按统一的格式进行存储 表&#xff1a; 将不同的记录组织在一起用来存储具体数据 数据库&#xff1a; 表的集合&#xff0c;…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...