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

news2025/1/16 5:39:57

目录

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条件语句构造“条件”断点在命中一个断点后再设置后续断点等等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

循环购模式:美妆行业的新趋势

美妆是一种能够提升自信和魅力的艺术,它让每个人都可以展现自己的个性和风格。但是,美妆也是一种需要不断更新和学习的技能,它需要消费者投入时间和金钱,才能找到适合自己的产品和方法。有没有一种方式,可以让美妆变得…

用python画一个柱状图可能用到的代码【完整版】

画柱状图 导入包 import torch as t import numpy as np import pandas as pd import matplotlib.pyplot as plt import joblib import matplotlib as mpl设置默认字体格式为"Times New Roman" font_name Times New Roman mpl.rcParams[font.family] font_name通…

stable diffusion实践操作-提示词插件安装与使用

本文专门开一节写提示词相关的内容,在看之前,可以同步关注: stable diffusion实践操作 正文 1、提示词插件安装 1.1、 安装 1.2 加载【应用更改并重载前端】 1.3 界面展示 1.3.-4 使用 里面有个收藏列表,可以收藏以前的所有提示…

STM32f103入门(7)pwm驱动led驱动舵机驱动直流电机

PWM驱动 PWM介绍TIM_OC1Init 配置通道TIM_OCStructInit 输出比较参数默认值输出比较模式 TIM_OCInitstructure输出比较极性 TIM_OCInitstructure设置输出使能以下三个决定了PWM的频率 占空比初始化通道 TIM_OC1Init(TIM2, &TIM_OCInitstructure);GPIO复用 PWM通道 驱动LED复…

2022年09月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:城堡问题 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####—#####—#—#####—# 2 # # | # # # # # #—#####—#####—#####—# 3 # | | # # # # # #—#########—#####—#—# 4 # # | | | | # # ############################# (图 1)…

关于git约定式提交IDEA

背景 因为git提交的消息不规范导致被乱喷,所以领导统一规定了约定式提交 官话 约定式提交官网地址 约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。 通过在提交信息中描述功能…

【算法】递归的概念、基本思想

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

LuatOS 开发指南

NDK 开发 官方教程 官方例程 API 下载软件 下载官方NDK例程压缩包到本地&#xff0c;并解压。可以看到目录如下&#xff1a; doc: 文档教程 env: 编译环境 example: NDK示例 platform: 需要编译的平台&#xff08;air72x/air8xx&#xff09; tools: 其他辅助软件 VSCode 使…

问道管理:成交量买卖公式?

跟着股票商场的如火如荼&#xff0c;人们对于怎么解读和使用成交量进行股票生意的需求日积月累。成交量是指在某一特定时间内进行的股票生意的数量&#xff0c;它是投资者们研判商场状况和制定生意战略的重要指标之一。那么&#xff0c;是否存在一种最厉害的成交量生意公式呢&a…

day31 集合

一、Collection 创建对象 Collection c3 new HashSet(); //元素不可重复 无序 Collection c1 new ArrayList(); //元素可重复 有序collection方法 c.add() 添加引用类型数据 c.addAll() 添加collection对象 c.isEmpty() 判断是否为空 c.clear() 清空所有类容 c.…

深入了解Docker镜像操作

Docker是一种流行的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包成容器&#xff0c;以便在不同环境中轻松部署和运行。在Docker中&#xff0c;镜像是构建容器的基础&#xff0c;有些家人们可能在服务器上对docker镜像的操作命令不是很熟悉&#xff0c;本文将深…

xx音乐app逆向分析

目标 看一下评论的请求 抓包 这里使用httpcanary 请求包如下 POST /index.php?rcommentsv2/getCommentWithLike&codeca53b96fe5a1d9c22d71c8f522ef7c4f&childrenidcollection_3_1069003079_330_0&kugouid1959585341&ver10&clienttoken7123ecc548ec46d…

frida动态调试入门02——hook加密函数

说明 frida是一款Python工具可以方便对内存进行hook修改代码逻辑在移动端安全和逆向过程中常用到。 前置知识 frida动态调试入门01——定位关键代码 https://blog.csdn.net/qq_41690468/article/details/132607065 定位函数 关键函数 String code RequestUtil.paraMap(ad…

Linux 指令心法(四)`touch` 创建一个新的空文件

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 touch 是一个用于在 Linux 和 Unix 系统中创建空文件或更改现有文件的访问和修改时间的命令。如果指定的文件不存在&#xff0c;touch会创建一个新的空文件&a…

九、idSpanMap使用基数树代替原本的unordered_map 十、使用基数树前后性能对比

九、idSpanMap使用基数树代替原本的unordered_map 我们原本的idSpanMap用的是STL容器中的unordered_map哈希桶&#xff0c;因为STL的容器本身是不保证线程安全的&#xff0c;所以我们在访问时需要加锁保证线程安全&#xff0c;这也就是我们写的内存池的性能的瓶颈点。因为我做…

【MySQL】基础知识(二)

MySQL基础知识(二) 文章目录 MySQL基础知识(二)01 表操作1.1 创建表1.2 查看所有表1.3 查看指定表的结构1.4 删除表练习 02 CURD2.1 新增2.1.1 指定列插入2.1.2 datetime类型插入 2.2 查询2.2.1 全列查询2.2.2 指定列查询2.2.3 查询字段为表达式2.2.4 别名查询2.2.5 去重2.2.6 …

【Cookie和Session的那些事儿】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《集合与数据结构》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 认识Cookie和Session Cookie Cookie对象的特点 Cookie对…

【算法日志】动态规划刷题:股票买卖附加问题(day42)

代码随想录刷题60Day 目录 前言 含冷冻期的股票买卖最佳时期 含手续费的股票买卖最佳时期 前言 今天的股票买卖问题会附加一些条件&#xff0c;但总体难度不大。 含冷冻期的股票买卖最佳时期 该问题难点在于对几个状态进行解构并写出相应的状态转移方程。 int maxProfit(ve…

每日一博 - 漫谈流控小妙招

文章目录 Pre概述实现方式固定窗口算法&#xff08;计数器法&#xff09;定义实现 滑动窗口算法定义实现 漏桶算法定义实现 令牌桶算法定义实现每秒产生5个令牌应对突发流量平滑预热 网关限流流量整形中间件限流 Pre 深入理解分布式技术 - 限流 并发编程-25 高并发处理手段之…

Revit SDK:AutoParameter 添加参数

前言 这个例子介绍如果往族文件里添加参数。 内容 Revit 的参数&#xff0c;参考官方文档&#xff1a; 这个例子的关键接口&#xff1a; // 通过 FamilyManager 添加参数 FamilyParameter AddParameter(string parameterName, BuiltInParameterGroup parameterGroup, Categ…