访问0xdddddddd内存地址引发软件崩溃的问题排查

目录

1、问题描述

2、访问空指针或者野指针

3、常见的异常值

4、0xdddddddd内存访问违例问题分析与排查

5、关于0xcdcdcdcd和0xfeeefeee异常值的排查案例

6、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html       在C++软件中访问了有问题的指针变量,可能会引发程序产生异常,比如访问了空指针和野指针,这也是操作指针错误最常见的原因。今天我们就来讲一个操作已经释放内存的野指针实例,本例中的问题指针有些特殊,释放内存后指针值变为0xdddddddd,和以往常见的异常值0xfeeefeee有所不同。本文将详细讲述一下这个问题的完整分析过程,以供大家借鉴或参考。

1、问题描述

       某天在开发新功能,使用Visual Studio在Debug下调试代码,执行某一操作后程序就产生了异常,Visual  Studio中断了下来,调到了发生异常的代码处,显示代码处的指针m_pRoot值为0xdddddddd,如下所示:

此处是发生了崩溃。这行代码使用m_pRoot指针调用FindControl接口,由于FindControl是虚函数,调用时会触发虚函数调用时的二次寻址,会去访问m_pRoot中存放的内存首地址0xddddddddd,而对于32位程序,这个地址属于内核态的内存地址,用户态的代码是禁止访问的,所以触发了内存访问违例,产生了异常。

对于32程序,系统会给程序进程分配4GB的虚拟内存,其中0-2GB是用户态的内存,2GB-4GB是内核态的内存,用户态的代码不能访问内核态的内存,内核态的代码也不能访问用户态的内存。强行访问,就会触发内存访问违例,引发程序崩溃。

2、访问空指针或者野指针

       在操作指针时最常见的问题就是访问了空指针和野指针。操作这两类指针产生异常,均是因为使用指针去访问了指向类的数据成员,访问了不该访问的内存地址,引发内存访问违例。对于空指针,在使用空指针访问了类对象的数据成员,就会访问很小的内存地址,小于64KB地址值的内存区域是禁止访问的。

       产生野指针,主要有两个场景:

1)Release下没有对指针变量进行初始化,指针变量的值是个随机值,是分配内存时内存中残留的随机值,此时的指针就是野指针。
2)指针指向的内存被释放了,但指针没有置为NULL,此时的指针也是野指针。

       通过野指针中的值去访问指向类的数据成员,可能会触发访问不该访问的内存地址,触发内存访问违例,引发崩溃。 

3、常见的异常值

        C++程序中常见的异常值如下所示(异常值不区分大小写,比如0xcdcdcdcd也可以写成0xCDCDCDCD):

* 0xcccccccc:Used by  Microsoft's C++ debugging runtime library and many DOS environments to mark uninitialized stack memory.CC resembles the opcode of the  INT 3 debug breakpoint interrupt on x86 processors.
* 0xcdcdcdcd:Used by  Microsoft's C/C++ debug malloc() function to mark uninitialized heap memory, usually returned from HeapAlloc().
* 0xfeeefeee:Used by  Microsoft's debug HeapFree() to mark freed heap memory. Some nearby internal bookkeeping values may have the high word set to FEEE as well.
* 0xdddddddd:Used by MicroQuill's SmartHeap and Microsoft's C/C++ debug free() function to mark freed heap memory.
* 0xabababab:Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory.
* 0xabadcafe:A startup to this value to initialize all free memory to catch errant pointers.
* 0xbaadf00d:Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory.
* 0xbadcab1e:Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger.
* 0xbeefcace:Used by Microsoft .NET as a magic number in resource files.

主要关注0xcccccccc、0xcdcdcdcd、0xfeeefeee和0xdddddddd这四个异常值。这几异常值是Debug下默认设置的,0xcccccccc用来初始化未初始化的栈内存,0xcdcdcdcd用来初始化未初始化的堆内存,0xfeeefeee用来填充已经释放的堆内存,0xdddddddd也是用来填充已经释放的堆内存。

       我们需要对这些异常值有较强的敏感度,如果在调试代码中遇到这些异常值,可以明显的提示我们当前访问的内存大概出了什么问题。这样我们排查时就有了一定的方向。

0xfeeefeee和0xdddddddd都是用来填充已经释放的堆内存区域,但不太清楚这两个异常值的区别。我们经常在调试代码遇到0xfeeefeee,基本没遇到过0xdddddddd,本案例还是第一次遇到0xdddddddd。

4、0xdddddddd内存访问违例问题分析与排查

       根据异常中断时的弹窗提示,当前的m_pRoot指针值为0xdddddddd,通过这个异常值的含义大概知道可能是访问了已经释放内存的野指针引发的。

其实最开始看到0xdddddddd异常值,并不知道其含义,因为以前遇到访问已经释放内存的场景都是出现0xfeeefeee这个异常值,从来没见过0xdddddddd,这还是第一次遇到。后来到网上查了才知道,0xdddddddd也是Debug下用来填充已经释放的内存区域的。

       0xdddddddd异常值提示我们程序中访问了已经释放的内存区域,那我们只要去分析这块内存是何时释放的,结合当前访问的代码,大概就知道原因了。但因为当前的代码逻辑比较复杂,且相关模块不是我维护的,直接去排查可能会比较费劲。

       根据Visual Studio中断的代码位置:

结合当时的函数的调用堆栈,当时对应的类为CSmallVideoWndUI,所以要排查这个必现的问题有个很好的办法,在CSmallVideoWndUI的析构函数设置断点

一旦有delete CSmallVideoWndUI类对象时就会进入析构函数,就会命中断点,这样查看函数调用堆栈就知道是何处将CSmallVideoWndUI对象delete了。

       但还有个问题,很多代码都使用了该类,代码中会频繁的new和delete CSmallVideoWndUI类对象,所以直接在CSmallVideoWndUI析构函数中打断点,可能会多次命中断点,这样就不好确定哪次析构是和当前的问题相关的。所以还要再设置一个断点,这个异常崩溃是执行鼠标双击操作引发的,我们可以在双击消息的响应函数中先设置一个断点:

当命中该断点后,再到CSmallVideoWndUI类的析构函数中设置断点,这样命中CSmallVideoWndUI析构函数断点时可能就和本问题有关了。

       使用上述调试方法,很快找到了问题代码,解决了问题。

5、关于0xcdcdcdcd和0xfeeefeee异常值的排查案例

       关于常见异常值0xcdcdcdcd和0xfeeefeee的排查案例,可以参见我之前写的文章:
0xcdcdcdcd异常值引发C++程序崩溃问题的详细分析icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/128380751排查软件启动时访问了0xcdcdcdcd内存地址导致内存访问违例的崩溃icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125266735排查软件关闭时访问了0xfeeefeee内存地址导致内存访问违例的崩溃icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125267046

6、最后

       大家在调试代码要提高对0xcccccccc、0xcdcdcdcd、0xfeeefeee和0xdddddddd等常见异常值的敏感度,看到这些异常值就能大概地估计是什么原因导致的,这样我们就有了问题排查的方向。此外,在设置断点也要有一定的技巧,比如使用数据断点监测内存越界问题人为添加if条件语句构造“条件”断点在命中一个断点后再设置后续断点等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/99530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ag-grid-vue】列定义(Updating Column Definitions)

列定义一节解释了如何配置列。可以在初始设置列之后更改列的配置。本节介绍如何更新列定义。 添加和删除列 可以通过更新提供给网格的列定义列表来添加和删除列。当设置新列时,网格将与当前列进行比较,并计算出哪些列是旧的(要删除)、哪些列是新的(创建…

什么是 TF-IDF 算法?

简单来说,向量空间模型就是希望把查询关键字和文档都表达成向量,然后利用向量之间的运算来进一步表达向量间的关系。比如,一个比较常用的运算就是计算查询关键字所对应的向量和文档所对应的向量之间的 “相关度”。 简单解释TF-IDF TF &…

第一个react应用程序并添加样式

编写第一个react应用程序 将目录下的文件、src文件夹、public文件夹清空&#xff0c;项目根目录下新建一个文件index.js 在文件中写入以下代码 import React from react import ReactDOM from react-dom ReactDOM.render(<h1>欢迎进入React的世界</h1>,document.…

编译工具:CMake(六) | 使用外部共享库和头文件

编译工具&#xff1a;CMake&#xff08;六&#xff09; | 使用外部共享库和头文件 步骤引入头文件搜索路径为 target 添加共享库 步骤 在/Compilation_tool/cmake 目录建立 t4 目录 建立src目录&#xff0c;编写源文件main.c&#xff0c;内容如下&#xff1a; #include <…

MybatisPlus(2)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 上篇我们简单介绍了MybatisPlus的方便之处&#xff0c;这篇来深入了解Myb…

数据并行 - DP/DDP/ZeRO

数据并行DP 数据并行的核心思想是&#xff1a;在各个GPU上都拷贝一份完整模型&#xff0c;各自吃一份数据&#xff0c;算一份梯度&#xff0c;最后对梯度进行累加来更新整体模型。理念不复杂&#xff0c;但到了大模型场景&#xff0c;巨大的存储和GPU间的通讯量&#xff0c;就…

3D虚拟数字人定制+AI交互数字人技术,助力企业开启营销新思路

近日&#xff0c;番茄小说推出数字人IP番卷卷&#xff0c;其承担着连接现实世界与番茄世界的重要角色&#xff0c;作为用户进入番茄世界的数字导游。数字人番卷卷的出现&#xff0c;一方面能够强化品牌在用户层面的心智&#xff0c;另一方面可以让用户拥有多层次、多情感、角色…

开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比

作者&#xff1a;刘军 不论您是一名开发者、架构师、CTO&#xff0c; 如果您曾深度参与在微服务开发中&#xff0c;那么相信您一定有过开源微服务框架或体系选型的疑问&#xff1a;Apache Dubbo、Spring Cloud、gRPC 以及 Service Mesh 体系产品如 Istio&#xff0c;到底应该选…

MySQL创建用户时报错“Your password does not satisfy the current policy requirements“

MySQL创建用户时报错"Your password does not satisfy the current policy requirements" MySQL是一个流行的关系型数据库管理系统&#xff0c;它提供了许多安全性特性&#xff0c;其中之一是密码策略。在创建或更改用户密码时&#xff0c;MySQL会检查密码是否符合当…

3D点云处理:圆柱侧面点云展开为平面 凹凸缺陷检测(附源码)

文章目录 1. 基本内容展开部分推导2. 展开流程3. 代码实现4. 应用文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_目标:对采集的圆柱面点云展开为平面;应用:可用于检测圆柱侧面的凹凸缺陷;1. 基本内容 圆柱的侧面展开原理是将一个圆柱体(或柱体)的侧面展开成一个…

一个中年程序员的10年测试人生,进阶测试专家必备5项技能!

测试架构师成长线路图 第一步、成为互联网时代合格的测试工程师 如果你是入行不满3年的测试工程师&#xff0c;一定对此有迫切需求。此时&#xff0c;你必须迅速掌握被测软件的业务功能与内部架构&#xff0c;并在此基础上运用各种测试方法&#xff0c;尽可能多地发现潜在缺陷…

curl通过webdav操作alist

创建目录: url202320230828;curl -v -u "admin":"这里是密码" -X MKCOL "http://127.0.0.1:5244/dav/my189tianyi/${url2023}/" 上传文件: curl -v -u "admin":"这里是密码" -T /tmp/aa.json "http://127.0.0.1:52…

按软件开发阶段的角度划分:单元测试、集成测试、系统测试、验收测试

1.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff0c;又称模块测试。对软件的组成单位进行测试&#xff0c;其目的是检验软件基本组成单位的正确性。测试的对象是软件里测试的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;…

提高Python并发性能 - asyncio/aiohttp介绍

在进行大规模数据采集时&#xff0c;如何提高Python爬虫的并发性能是一个关键问题。本文将向您介绍使用asyncio和aiohttp库实现异步网络请求的方法&#xff0c;并通过具体结果和结论展示它们对于优化爬虫效率所带来的效果。 1. 什么是异步编程&#xff1f; 异步编程是一种非阻…

【枚举区间+线段树】CF Ehu 152 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 感觉是个套路题 对区间计数&#xff0c;按照CF惯用套路&#xff0c;枚举其中一个端点&#xff0c;对另一个端点计数 对于这道题&#xff0c;枚举右端点&#xff0c;对左端点计数 Code&#xff1a; #include &…

go语言配置

1、Go语言的环境变量 与Java等编程语言一样&#xff0c;安装Go语言开发环境需要设置全局的操作系统环境变量&#xff08;除非是用包管理工具直接安装&#xff09; 主要的系统级别的环境变量有两个: &#xff08;1&#xff09;GOROOT&#xff1a;表示Go语言环境在计算机上的安…

Linux测开常用命令总结

文章目录 Linux系统中文件目录树 基本指令的使用&#xff1a; Linux命令的帮助信息查看 --help command --help 说明&#xff1a; 显示command 命令的帮助信息通过man命令查看帮助信息 man command( 命令的名称) man 命令查看的帮助信息更加详细ls&#xff0c;pwd&#xff0c…

分享一套全开源无加密海外跨境商城源码

武汉一一零七科技有限公司&#xff0c;作为一家专注于海外跨境电商领域的公司&#xff0c;为广大商家提供了一套全新的海外跨境商城源码。该源码融合了多年来我们对于海外市场的深入研究和积累&#xff0c;致力于帮助商家拓展海外市场&#xff0c;提升销售额。 这套海外跨境商城…

完整开发实现公众号主动消息推送,精彩内容即刻到达

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Samba服务器

目录 一、什么是Samba&#xff1f; 二、Samba进程 三、Samba主要功能 四、Samba工作流程 五、Samba安全级别 六、Sam主配置文件/etc/samba/smb.conf 七、Samba服务配置案例 一、什么是Samba&#xff1f; Samba可以让linux计算机和windows计算机之间实现文件和打印机资源共享的一…