使用Windbg在XP下Heap追踪失败的原因
1、故事背景
最近同事的代码中碰到一个bug会导致奔溃的bug,从dump上看是由于某个对象的堆内存指针被释放了,但代码仍调用了该对象指针的虚函数,从而引起内存访问违法崩溃,由于该类被大量使用,无法直接定位到具体哪个类被提前释放了,从而打算开启堆页检查,跟踪该对象堆内存指针被释放的代码位置,从而揪出元凶。
由于此bug在win7的机器上不易重现,在xp sp3的机器上较容易重现,故准备在xp sp3的机器上开启堆页检查(DHP),跟踪该对象指针被释放的代码位置和时机,由于未从用过gflag进行堆页检查和调试,故先写了段小代码练练手:
用gflag开启堆页检查:
设好符号文件后祭出 Windbg 走起,崩溃触发后断下,输入 !heap -p -a ecx 指令一举揪出元凶,但现实却是如此的骨感:
004010d9 8b11 mov edx,dword ptr [ecx] ds:0023:0161cff0=???????? 0:000> !heap -p -a ecx ReadMemory error for address eeddccee Use `!address eeddccee' to check validity of the address.
注:此处 ecx = pCTest
"mov edx,dword ptr [ecx]"表示取虚表指针
Windbg提示的读取内存错误,且改地址的内容无法显示,查看下该内存地址属性:
0:000> !address ecx
015d0000 : 0161b000 - 000b5000
Type 00020000 MEM_PRIVATE
Protect 00000001 PAGE_NOACCESS
State 00001000 MEM_COMMIT
Usage RegionUsagePageHeap
Handle 015d1000
address命令正确的指示了该地址为私有堆内存,但该内存页不可访问。
难道是堆页开启不正确?检查注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options,确定已经正确的设置了,尝试其他多种设置,甚至换工具进行设置,但结依然如此。难道是机器问题?于是在win7 32位机器上重复上述过程,发现是可以正确的打印出堆内存指针被释放的栈回溯的:
但更换其他xp机器依然不能正确显示。百度搜索无果,仔细看glfag使用说明和各项设置文档也无果,最后去翻了翻 Windows 调试的权威书《软件调试》关于页堆的章节,并按照该书666页查找栈回溯数据库的方法查了下所有UST数据库的回溯记录,找到了"CTEST* pCTest = new CTEST(); "的栈回溯几率,即申请堆内存的记录,但始终未找到释放堆内存的记录。于是再次怀疑xp下的页堆并没有真正启动或启动是有问题的,于是检查下页堆启动情况:
惊现“ReadMemory error for address eeddccee”,且只展示一个Page Heap句柄了,剩下的未展示完全,但页堆明明白白的现实已经开启,也有了准页堆,但数据却显示不出来,说明数据可能被破坏,但测试代码如此简单,而且也被windbg第一时间断下,不可能去破坏数据,难道是Windbg读取有问题?于是再次对此疑问进行google,果然有个外国朋友也碰到了类似的问题,其在帖子中提出换成6.6.0007.5版即可解决,试了下果然在xp下顺利输出了用户态栈回溯。那么为什么高版本的Windbg会出现此问题呢?
我想起在查找UST数据结构的时候,发现和《软件调试》上写的不一致,当时疑惑了下没有在意,再次翻出来对比发现:
Win7下StackTraceDataBase结构
XP下StackTraceDataBase结构
Win7下的 _STACK_TRACE_DATABASE 结构和xp下并不完全相同,关键的 Buckets(栈回溯记录)的结构偏移改了,而且原xp下是个数组,但win7下却变成了链表,故猜测高版本的Windbg在xp下依然使用了win7下的某些数据结构,从而导致Windbg解析出了问题,不知道算不算微软的bug。
由于低版本的Windbg已经很难找到了,故这里也放出我找到的6.6.0007.5版:
Widnbg6.6.0007.5.exe
使用Windbg在XP下Heap追踪失败的原因的更多相关文章
- reggetvalue在xp下加载失败
在windows 32bit的xp下使用reggetvalue会提示,无法定位程序输入点reggetvalueW于动态链接库advapi32.dll(UNICODE).reggetvalueA也是无法 ...
- 在新建的python3环境下运行jupyter失败的原因
在deeplearning中再运行jupyter notebook就出现了错误: (deeplearning) userdeMBP:~ user$ jupyter notebook -bash: ju ...
- 在XP下安装PHP
最近,有许多朋友问我在WindowsXp下PHP的安装过程,正好最近我在自己的机器上成功的以模块化的方式安装了PHP4.23.既然这么多朋友需要,我就以最常见的IIS和Apache服务器为例,把PHP ...
- 在XP下基于VHD版XP 2003 win7制作的RAMOS心得
在XP下基于VHD版win7制作的RAMOS心得1.用DiskGenius创建1.85G的VHD固定磁盘文件,以win7prosen.vhd为例,然后进行分区格式化,格式化时启用NTFS压缩.2.为了 ...
- xp下删除windows7,无法删除windows7文件夹,无法删除windows7文件,双系统卸载,取得文件权限
http://blog.csdn.net/lanmanck/article/details/5722050 ---------------------------------------------- ...
- 转:windows xp下如何安装SQL server2000企业版
SQL2000企业版本 适用于WIN 2000 Server系统和Windows 2003系统,Windows XP一般装不了需要选用个人版或开发板.但是企业版也可以安装在xp系统下.这里介绍一个XP ...
- windows下redis启动失败提示maxheap flag
windows下redis启动失败 D:\redis>redis-server.exe redis.conf [] Oct ::39.789 # The Windows version of R ...
- 如何让VS2012编写的程序在XP下运行
Win32主程序需要以下设置 第一步:在工程属性General设置 第二步:在C/C++ Code Generation 设置 第三步:SubSystem 和 Minimum Required Ve ...
- xp 下查看进程指令
xp 下快速查看进程及关联 exe 的指令,刚发现,还没有测试 win7 和 win10 支持不支持. wmic process where creationclassname="win32 ...
随机推荐
- QT5.1 调用https
以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
- jsp原理
在eclipse里jsp编译后的java和class文件的位置 eclipse版本不一样,位置也不一样第一种:1.java类编译后产生的.class文件在D:\workspace\test\WEB-I ...
- 基于MVC4+EasyUI的Web开发框架经验总结(17)--布局和对话框自动适应大小的处理
在我自己的<Web开发框架>中,用了很多年的EasyUI,最新版本EasyUI为1.4.5,随着版本的更新,其很多功能得到了很大的完善和提高,同时也扩展了一些新的功能,以前在布局和对话框弹 ...
- .NET Core全新路线图(译)
标签: .NETCore 翻译 承接张善友大大的.NET Core全新路线图,翻译了原文,水平有限,尽量一观. 原文地址<.NET Core Roadmap>,原作者Scott Hunte ...
- jQuery弹出深色系层菜单
低调奢华jQuery弹出层菜单,使用新版的jQuery库,兼容多种浏览器.Demo展示: http://hovertree.com/texiao/layer/3/ 本特效可以作为网站的引导页,使用jQ ...
- 说说&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true 时,整个运算结果才为true,否则,只要有一方为false,则结果为false. ...
- MyEclipse或者Eclipse内存溢出问题
对于一些项目,我们经常会遇到内存溢出的问题,这个时候我们就需要进行设置JDK的各个内存的大小了. 如果是运行项目以后出现问题的话,那么主要还是jdk或者是tomcat的内存问题,至于网上说的xxx.i ...
- 在Python应用中使用MongoDB
Python是开发社区中用于许多不同类型应用的强大编程语言.很多人都知道它是可以处理几乎任何任务的灵活语言.因此,在Python应用中需要一个什么样的与语言本身一样灵活的数据库呢?那就是NoSQL,比 ...
- postgreSQL时间、日期函数
一.获取系统时间函数 1.1.获取当前完整时间 select now(); select current_timestamp; 1.2.获取当前日期 select currnt_date: 1.3.获 ...