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

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

相关文章:

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

目录 1、问题描述 2、访问空指针或者野指针 3、常见的异常值 4、0xdddddddd内存访问违例问题分析与排查 5、关于0xcdcdcdcd和0xfeeefeee异常值的排查案例 6、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)ht…...

Java从入门到精通-流程控制(一)

流程控制 1.复合语句 复合语句,也称为代码块,是一组Java语句,用大括号 {} 括起来,它们可以被视为单个语句。复合语句通常用于以下情况: - 在控制结构(如条件语句和循环)中包含多个语句。 - …...

MybatisPlus(2)

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

iOS UITableView上拉加载解决偶然跳动的Bug

最近做项目,测试测出来一个Bug,列表添加了上拉刷新和下拉加载,当我弹窗消失时,调用刷新列表后,在某个手机型号上,偶发列表刷新跳动的bug。(一般在列表上拉加载刷新到最后一页后,再弹窗消失,reload列表,会出现此bug) Bug复现如下:RPReplay_Final1693296737 解决方案…...

MySQL 外键使用详解

1、MySQL 外键约束语法 MySQL 支持外键,允许在表之间进行相关数据的交叉引用,并有助于保持相关数据的一致性。 一个外键关系涉及到一个父表,该父表保存初始列值,和一个子表,子表的列值引用父表的列值。外键约束定义在…...

MongoDB实验——在MongoDB集合中查找文档

在MongoDB集合中查找文档 一、实验目的二、实验原理三、实验步骤1.启动MongoDB数据库、启动MongoDB Shell客户端2.数据准备-->person.json3.指定返回的键4 .包含或不包含 i n 或 in 或 in或nin、$elemMatch(匹配数组)5.OR 查询 $or6.Null、$exists7.…...

事务的总结

数据库事务 数据库事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整地执行,要么完全不执行。事务管理是一个重要组成部分,RDBMS 面向企业应用程序,以确保数据完整性和一致性。事务的概念可以描述为具有以下四个关键属性描述…...

[ROS]yolov5-7.0部署ROS

YOLOv5是一种目标检测算法,它是YOLO(You Only Look Once)系列算法的最新版本。与其它目标检测算法相比,YOLOv5在速度和准确性方面取得了显著的提升。在ROS(Robot Operating System)中使用Python部署YOLOv5可…...

Java抽象方法、抽象类和接口——第七讲

前言 上一讲,我们深入了解面向对象,介绍了面向对象有三个特征——封装、继承、多态,以及介绍方法的重载和重写,这些都是开发中很常用的特征,基本都尊重面向对象思想。再上一讲我们了解到了继承的时候,子类要重新写父类的方法,才能遵循子类的规则,那么忘记重写怎么办呢?…...

kafka集群之kraft模式

一、概要 Kafka作为一种高吞吐量的分布式发布订阅消息系统,在消息应用中广泛使用,尤其在需要实时数据处理和应用程序活动跟踪的场景,kafka已成为首选服务;在Kafka2.8之前,Kafka强依赖zookeeper来来负责集群元数据的管理…...

虹科案例 | 缆索挖掘机维护—小传感器,大作用!

一、 应用背景 缆索挖掘机 缆索挖掘机的特点是具有坚固的部件,如上部结构、回转环和底盘。底盘是用于移动挖掘机的下部机械部件,根据尺寸和型号的不同,由轮子或履带引导,并承载可转动的上部车厢。回转环连接上部和下部机器部件&am…...

Windows安装FFmpeg说明

下载地址 官网 Download FFmpeg Csdn ffmpeg安装包,ffmpeg-2023-08-28-git-b5273c619d-full-build.7z资源-CSDN文库 解压安装,添加环境变量 命令行输入ffmpeg 安装成功...

电子电路原理题目整理(1)

电子电路原理题目整理(1) 最近在学习《电子电路原理》,记录一下书后面试题目,答案为个人总结,欢迎讨论。 1.电压源和电流源的区别? 电压源在不同的负载电阻下可提供恒定的负载电压,而电流源对于…...

iPhone 15预售:获取关键信息

既然苹果公司将于9月12日正式举办iPhone 15发布会,我们了解所有新机型只是时间问题。如果你是苹果的狂热粉丝,或者只是一个早期用户,那么活动结束后,你会想把所有的注意力都集中在iPhone 15的预购上——这样你就可以保证自己在发布日会有一款机型。 有很多理由对今年的iPh…...

Kind创建本地环境安装Ingress

目录 1.K8s什么要使用Ingress 2.在本地K8s集群安装Nginx Ingress controller 2.1.使用Kind创建本地集群 2.1.1.创建kind配置文件 2.1.2.执行创建命令 2.2.找到和当前k8s版本匹配的Ingress版本 2.2.1.查看当前的K8s版本 2.2.2.在官网中找到对应的合适版本 2.3.按照版本安…...

MySQL与Oracle数据库通过系统命令导出导入

MySQL导出 mysqldump -uroot -ppassword 库名 表名 --where"s_dtend<2023-05-01 00:00:00 and s_dtend>2023-01-01 00:00:00 and (i_mbr!10000 OR (i_mbr 10000 AND I_ACTV IN (SELECT I_ACTV FROM t_mk_activity WHERE S_DTEND < 2023-05-01 00:00:00)))"…...

从零学算法(剑指 Offer 36)

123.输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 我们希望将这个二叉搜索树转化为双向循环链表。…...

【Unity3D】UI Toolkit容器

1 前言 UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery&#xff0c;本文将介绍 UI Toolkit 中的容器&#xff0c;主要包含 VisualElement、ScrollView、ListView、UI Toolkit&#xff0c;官方介绍详见→UXML elements reference。 2 VisualElement&#xff08;空容器&…...

手把手教你写出第一个C语言程序

Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…...

flink维度表关联

分析&回答 根据我们业务对维表数据关联的时效性要求&#xff0c;有以下几种解决方案&#xff1a; 1、实时查询维表 实时查询维表是指用户在Flink 的Map算子中直接访问外部数据库&#xff0c;比如用 MySQL 来进行关联&#xff0c;这种方式是同步方式&#xff0c;数据保证是…...

Docker Compose 安装使用 教程

Docker Compose 1.1 简介 Compose 项目是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的 快速编排 。从功能上看&#xff0c;跟 OpenStack 中的 Heat 十分类似。 其代码目前在 https://github.com/docker/compose 上开源。 Compose 定位是 「定义和运行多个…...

睿趣科技:开抖音小店挣钱吗到底

在当今数字化时代&#xff0c;社交媒体平台成为了创业者们寻找商机和赚钱的新途径。而抖音作为一款风靡全球的短视频分享平台&#xff0c;自然也成为了许多人开设小店、进行创业的选择之一。那么&#xff0c;开抖音小店能否真正实现盈利&#xff0c;成为了一个备受关注的话题。…...

国际腾讯云账号云服务器网络访问丢包问题解决办法!!

本文主要介绍可能引起云服务器网络访问丢包问题的主要原因&#xff0c;及对应排查、解决方法。下面一起了解腾讯云国际云服务器网络访问丢包问题解决办法&#xff1a; 可能原因 引起云服务器网络访问丢包问题的可能原因如下&#xff1a; 1.触发限速导致 TCP 丢包 2.触发限速导致…...

Deepnote:为什么我停止使用 Jupyter Notebook

Jupyter 笔记本已经成为必不可少多年来用于众多数据科学工作流程的工具。其中包括执行数据挖掘、分析、处理、建模以及在每个数据科学项目的生命周期中执行的一般日常实验任务。 Jupyter(作者提供的图片) 尽管它很受欢迎,但许多数据科学家也指出了它的众多缺点,例如这里和...

山西省文物局与大势智慧签订战略合作协议

8月24日&#xff0c;由山西省文物局、中国文物信息咨询中心(国家文物局数据中心)主办的数字文博发展论坛在太原举行。武汉大势智慧科技有限公司&#xff08;后简称“大势智慧”&#xff09;受邀参与&#xff0c;与来自国内文博数字化领域的专家学者齐聚一堂&#xff0c;围绕“数…...

Java设计模式:一、六大设计原则-02:开闭原则

文章目录 一、定义&#xff1a;开闭原则二、模拟场景&#xff1a;开闭原则2.0 工程结构2.1 定义面积计算接口2.2 面积计算实现类 三、违背方案&#xff1a;开闭原则四、改善代码&#xff1a;开闭原则4.1 扩展继承4.2 单元测试 一、定义&#xff1a;开闭原则 开闭原则&#xff…...

DETRs Beat YOLOs on Real-time Object Detection

目录 1、模型架构1.1高效混合编码器1.1.1 尺度内特征交互模块AIFI1.1.2 跨尺度特征融合CCFM 1.2IoU感知查询选择总结 DETRs在实时目标检测中击败YOLO 问题&#xff1a;DETR的高计算成本&#xff0c;实时检测效果有待提高 解决&#xff1a;提出了一个实时的目标检测器 具体来说…...

【数据分享】1901-2022年1km分辨率的逐月降水栅格数据(免费获取/全国/分省)

气象指标在日常研究中非常常用&#xff0c;之前我们给大家分享过来源于国家青藏高原科学数据中心提供的气象指标栅格数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff1a; 1901-2022年1km分辨率逐月平均气温栅格数据1901-2022年1km分辨率逐年平均气温栅格数据…...

全网首发!奔驰宝马奥迪卡带机卡带通道激活模块,无损安装可以接2路AUX

文章目录 1.前言2.时序逆向分析2.1协议分析2.2卡带音频通道引出 3、PCB设计4、程序设计5、焊接调试6、结语 1.前言 ​ 之前写过四篇关于车机增加音频输入的方法。 1、07宝来经典车机CD收音机&#xff08;RC668&#xff09;改装增加蓝牙播放音乐 2、全网首发&#xff01;老大…...

反弹shell总结

反弹shell总结 讲在前面说的话:反弹shell总结nc反弹shell正向shell反向shell正向shell(服务端被攻击):反向shell(客户端被攻击):无nc反弹shellpython反弹shellbash反弹shellPHP反向shellPerl反向shellJava反弹shellsocat 反弹shellRuby反弹shellLua反弹shellAwk 反弹she…...