重复delete 对象指针后的 异常调用栈怪异 解析

news2024/11/27 20:30:22

Release版VC6 MFC程序 程序正常退出时得到一个如下异常调用栈:复制代码

0:000> kb
 # ChildEBP RetAddr      Args to Child              
WARNING: Frame IP not in any known module. Following frames may be wrong.
00 0019eb94 76124f2f     00c3afc8 0019ebdc 0019ebb8 0x8c73d01
01 0019ebdc 0079451a     00c3afc8 73d82ec0 00000001 USER32!IsZoomed+0xaf
02 0019ebe4 73d82ec0     00000001 73d35d1c 00c3afc8 JXC_MED!CMainFrame::`scalar deleting destructor'+0x8
03 0019ebec 73d35d1c     00c3afc8 00000000 73d35c0f MFC42!CControlFrameWnd::PostNcDestroy+0xb
04 0019ec2c 73d31e1d     00c3afc8 00c3afc8 00cae670 MFC42!CWnd::OnNcDestroy+0x10d
05 0019eca4 73d31b07     00000082 00000000 73dca448 MFC42!CWnd::OnWndMsg+0x2f4
06 0019ecc4 73d31a78     00000082 00000000 00000000 MFC42!CWnd::WindowProc+0x22
07 0019ed24 73d319d0     00c3afc8 00000000 00000082 MFC42!AfxCallWndProc+0x91
08 0019ed44 73dbe00c     00031002 00000082 00000000 MFC42!AfxWndProc+0x34
09 0019ed70 76135cab     00031002 00000082 00000000 MFC42!AfxWndProcBase+0x39
0a 0019ed9c 761267bc     73dbdfd3 00031002 00000082 USER32!_InternalCallWinProc+0x2b
0b 0019ee80 7612635a     73dbdfd3 00000000 00000082 USER32!UserCallWinProcCheckWow+0x3ac
0c 0019eee4 76133f87     01225f90 00000000 00000082 USER32!DispatchClientMessage+0xea
0d 0019ef28 77e62add     0019ef44 00000020 0019efac USER32!__fnNCDESTROY+0x37
0e 0019ef60 73d364c5     00031002 009a034c 009a1f14 ntdll!KiUserCallbackDispatcher+0x4d
0f 0019ef74 00794760     009a8968 00000000 00c3afc8 MFC42!CWnd::DestroyWindow+0x31
10 0019efb8 73d38fb4     00c3afc8 00c3afc8 00794965 JXC_MED!CMainFrame::DestroyWindow+0x13c [MainFrm.cpp @ 852] 
11 0019efd0 02b056f3     00000000 00794a45 00c3afc8 MFC42!CFrameWnd::OnClose+0xf5
12 0019efec 007949a3     00000000 73dca64c 00000001 ToolLib!CTFrameWnd::OnClose+0x13
13 0019f044 73d31e1d     00c3afc8 00c3afc8 00cae670 JXC_MED!CMainFrame::OnClose+0x3e [MainFrm.cpp @ 1133] 

顶层两个函数调用帧都是错的,地址怪异 ,没有函数名子通过反汇编校验,根据帧返回地址是 0079451a 判断出具体函数源码位置, 

JXC_MED!CMainFrame::`scalar deleting destructor':
00794512 56             push    esi
00794513 8bf1           mov     esi, this (ecx)
00794515 e814000000     call    JXC_MED!CMainFrame::~CMainFrame (79452e) //顶层栈实际上是在调用此析构函数中的代码
0079451a f644240801     test    byte ptr [esp+8], 1
0079451f 7407           je      JXC_MED!CMainFrame::`scalar deleting destructor'+0x16 (794528)
00794521 56             push    esi
00794522 e8338c0000     call    JXC_MED!operator delete (79d15a)
00794527 59             pop     this (ecx)
00794528 8bc6           mov     eax, esi
0079452a 5e             pop     esi
0079452b c20400         ret     4
JXC_MED!CMainFrame::~CMainFrame:
0079452e b806828200     mov     eax, 828206h
00794533 e8489b0000     call    JXC_MED!__EH_prolog (79e080)
00794538 51             push    this (ecx)
00794539 51             push    this (ecx)
0079453a 56             push    esi
0079453b 8bf1           mov     esi, this (ecx)
0079453d 57             push    edi
0079453e 8975f0         mov     dword ptr [ebp-10h], esi
00794541 c70668a98800   mov     dword ptr [esi], 88A968h
00794547 8b8e58040000   mov     this (ecx), dword ptr [esi+458h]
0079454d c745fc06000000 mov     dword ptr [ebp-4], 6
00794554 85c9           test    this (ecx), this (ecx)
00794556 7407           je      JXC_MED!CMainFrame::~CMainFrame+0x31 (79455f)
00794558 8b01           mov     eax, dword ptr [this(??) (ecx)] //通过指令飞越技术查出是这里出错,代码对应 delete loadWareWork;
0079455a 6a01           push    1
0079455c ff5004         call    dword ptr [eax+4]
0079455f a150889a00     mov     eax, dword ptr ds:[009A8850h]
00794564 83780400       cmp     dword ptr [eax+4], 0
00794568 741f           je      JXC_MED!CMainFrame::~CMainFrame+0x5b (794589)
00794623 c3             ret 

CMainFrame::~CMainFrame()
{
    if(loadWareWork) delete loadWareWork; //这个被重复删了 导至出错
    if (gpDb->IsOpen())
    {
        WriteOpLog(gpDb, gstrOprCode, GSP_OPLOG_MODULEID, "2", "退出系统"); 
    }
}

在内存窗口中查看此变量周围已经被16进制 feee feee填充,看我博文 Microsoft平台开发,内存特征码识别有讲述通过16进制分辨内存数据,说明此内存区已经被heap free.

图1:指令飞越技术重现@eip内存地址 0x8c73d01

解决办法,将这段代码删掉,此处多余的代码,理由是此类型是CWnd子类。不及格的程序员-八神
创建时使用WS_CHILD类型创建,它会随着父窗体自动DESTORY, 并且子类重载函数 PostNcDestroy 并 delete this了,不需要这里再次delete。 

 

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

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

相关文章

k8部署安装

1 环境初始化 1.1 检查操作系统的版本 此方式下安装kubernetes集群要求Centos版本要在7.5或之上 [rootmaster ~]# cat /etc/redhat-release Centos Linux 7.5.1804 (Core)1.2主机名成解析 三台服务器的/etc/hosts文件 192.168.90.100 master 192.168.90.106 node1 192.168.…

【雕爷学编程】Arduino动手做(09)---火焰传感器模块5

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

ASP.NET Core - 缓存之分布式缓存

分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。 与其他将缓存数据存储在单个应用服务器上的缓存方案相比&am…

【深度学习】再谈向量化

前言 向量化是一种思想,不仅体现在可以将任意实体用向量来表示,更为突出的表现了人工智能的发展脉络。向量的演进过程其实都是人工智能向前发展的时代缩影。 1.为什么人工智能需要向量化 电脑如何理解一门语言?电脑的底层是二进制也就是0和1&…

vmware克隆虚拟机后没有ip地址的问题

克隆虚拟机后,发现新克隆出来的虚拟机,有ens33网卡,但是没有192.168开头的ip,如下: 那是因为克隆后的虚拟机与之前的虚拟机ip重复导致,解决办法如下: 进入如下目录 cd /etc/sysconfig/networ…

优思学院|6西格玛标准值水平是多少?

在质量管理和统计学领域,"6西格玛" 是一个重要的概念,它与产品和流程的质量有着密切的关系。本文将解释"6西格玛"标准值水平是什么,以及它在各个行业中的应用。 什么是6西格玛标准值水平? 理解西格玛 西格…

ospf重发布

华子目录 一、实验拓扑二、实验要求三、实验思路1、配置接口IP地址以及环回地址(以此类推)2、配置动态路由协议3、重发布4、更改接口类型5、配置路由策略 一、实验拓扑 二、实验要求 1、使用双点双向重发布2、所有路由器进行最佳选路3、存在备份路径&am…

眼镜中的“黑科技”| 3D打印眼镜为您带来全新配戴体验

3D打印定制眼镜 你的眼镜应为你而生 每次换眼镜的时候,近视人士往往都会遇到选镜框的烦恼…… “这个镜框风格我喜欢,但是尺寸不合适,好可惜” “孩子调皮好动,镜架总是摔坏” “想要一款眼镜,适合头围大、瞳距小…

h3c 7506 IRF和MAD多活配置案例

IRF配置 irf mac-address persistent always irf auto-update enable irf auto-merge enable undo irf link-delay irf member 1 priority 1 irf member 2 priority 32 irf mode normal irf-port 1/2 port group interface Ten-GigabitEthernet1/1/0/39 mode enhanced port g…

司徒理财:8.11黄金最新走势分析早盘1914现价多

黄金昨日再次破位新低,但是下跌力度出现衰竭迹象,意味着本次下跌暂时告一段落,行情将会开启一波反弹,早盘1914现价直接多,先看反弹上涨!黄金从走势上看,日线上已经跌至前低附近,也是…

Zabbix6 对接飞书告警

文章目录 Zabbix对接飞书告警背景创建飞书群组Zabbix配置创建告警媒介类型创建动作用户关联飞书告警 Zabbix对接飞书告警 背景 运维 你看下他的进程是不是挂了,之前在9点28分有发消息的,这次没有发消息 哐哐哐的去看了一通,确实有个进程之前…

[保研/考研机试] KY80 进制转换 北京大学复试上机题 C++实现

题目链接: KY80 进制转换https://www.nowcoder.com/share/jump/437195121691735660774 描述 写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串(注意可能存在的一个测试用例里的多组数据)。 输入描述: 输…

机器学习、深度学习项目开发业务数据场景梳理汇总记录一

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理,文章会随着项目的开发推进不断更新。 一、MSTAR雷达影像数据 MSTAR(Moving and Stationary Target Acquisition and Recognition)雷达影像数据集是一种常用的合成孔…

数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)

目录 开放地址法的查找性能 线性探测法 平方探测法和双散列探测法 期望探测次数与装填因子的关系 分离链接法的查找性能 总结 散列表的性能分析 平均查找长度(ASL)用来度量散列表查找效率:成功、不成功关键词的比较次数,取…

YOLOv8+ByteTrack多目标跟踪(行人车辆计数与越界识别)

课程链接:https://edu.csdn.net/course/detail/38901 ByteTrack是发表于2022年的ECCV国际会议的先进的多目标跟踪算法。YOLOv8代码中已集成了ByteTrack。本课程使用YOLOv8和ByteTrack对视频中的行人、车辆做多目标跟踪计数与越界识别,开展YOLOv8目标检测…

AST入门与实战(一):基于babel库的js反混淆通用模板

AST入门与实战(一):基于babel库的js反混淆通用模板 首发地址:http://zhuoyue360.com/jsnx/106.html 1. 模板代码 通用模板来源自菜老板的知识星球. const fs require(fs); const types require("babel/types"); const parser require("babel/parser")…

为什么 Mixin 被认为是有害的

为什么 Mixin 被认为是有害的 Mixin 是在 Vue 2 中引入的,作为组件之间共享代码的解决方案,这种方式成为许多代码库不可或缺的一部分。然而,随着时间的推移,它们的使用开始出现问题。尽管 mixins 最初很有吸引力,但现…

今天我花了一个通宵的时间安装Windows11系统居然失败,忍不住哭了!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

Python爬虫:抓取表情包的下载链接

Python爬虫:抓取表情包的下载链接 1. 前言2. 具体实现3. 实现代码 1. 前言 最近发现了一个提供表情包的网址,觉得上面的内容不错,于是就考虑用Python爬虫获取上面表情包的下载链接。整体而言,实现这个挺简单的,就是找到提供表情包…

Kubernetes pod调度约束[亲和性 污点] 生命阶段 排障手段

调度约束 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。 APIServer…