捉虫记2:windows程序句柄泄露的上下文环境
作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一。软件在主体功能开发完成后会经历各个阶段的测试,才会被发布。在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软件Bug。而Windows作为一个相当成熟的平台,对于软件的调试也支持很到位。今天想要记录的是这次调查的一个模块的句柄泄漏问题。
关于句柄泄漏的文章网上很多,很多关于调试的书籍中也有说明,而且有些也比较详细。之前也解决过这类的问题,所以毫不在意。先介绍一下基本情况:工作机是Windows 7 64bit 专业版SP1,Windbg使用的是32bit的版本,出问题模块是32bit,依赖也多个外部模块,均为32bit,且自身包含了dbghelp.dll(后面介绍为什么单独说这个)。
照着Bug的描述,开始操作前搞上Windgb,设置好pdb,!htrace开启。操作了一番,在任务管理器中,发现被调试模块的句柄数蹭蹭蹭往上涨,停止操作后也没见有回落的迹象。见此情形,只好断入Windbg看看情况,看到!htrace -diff输入后显示的结果立马傻眼了。全都是虚地址,没有任何堆栈信息,立马想到是不是pdb不对,lmvm一看,显示正确。但是k显示的堆栈确实是有被调试模块的堆栈。一时想不到问题出在哪,那么就自己写个demo,看下是不是一样,写完demo挂上windbg,情况居然一样!这是感觉就有点诡异,问题应该不是出在被调试程序上,就度娘了一把,无任何发现。倒是在高端调试网站上有人发了个帖子,状况和我一样,但是没人回答怎么解决,无果。翻阅书籍,看到的都是千篇一律的,对于上述碰到的问题,无任何提及,无果。偶然在网上找到个工具http://pan.baidu.com/s/1jGIopqm,可以检测内存泄漏、句柄泄漏。将上面写的demo用上后,确实如实反映出了事件的泄漏点,感觉不错。然后就把出问题的模块用上。Inject的时候爆出一个错误,说被调试进程已经加载过dbghelp.dll。也就是上面特别提及的那点,无果。
想来想去,后来干脆就上了个64bit的Windbg,在调试32bit的demo时,!htrace -diff居然显示了几行堆栈,切换到x86模式下显示,确实显示了CreateEvent字眼,瞬间好像明白了什么。把demo编译条件切换到64bit,用64bit windbg再试,堆栈全部显示。然后就将泄漏的模块装在32bit机子上,用32bit windbg一看。未关闭句柄的堆栈全有了。至此水落石出。
为什么在64bit机器上,32bit的windbg调试32bit的进程,一般的函数调用,都能够显示堆栈,而对于差异的句柄堆栈,却不显示,没有答案。经过这一次发现,只关注问题的本身很重要,但有时往往会被一切外部的因素干扰到我们对事物的判断,这时候就应该站在一个高的高度,看待这问题,那么一切都明了了。
捉虫记2:windows程序句柄泄露的上下文环境的更多相关文章
- 捉虫记(四)线程安全导致的HighCpu
一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...
- PHP(SentCMS)网站 “新手”捉虫记
我拖着疲惫的身躯,努力打开眼皮在写...... 昨晚弄到12点,我感觉应该弄好了. 故事开头是这样的:我呢朋友有个网站需要开发,我当时没时间就包给外面的公司了,由于外面公司维护费用比较贵. 那么网站维 ...
- MapReduce全局变量之捉虫记
全局变量 写MapReduce程序时候,有时候须要用到全局变量,经常使用的全局变量实现由三种方式: 通过作业的Configuration传递全局变量.作业初始化的时候.conf.set(),须要的时候 ...
- [原]捉虫记3:_ConectionPtr指针调用open失败
背景 产品使用MySQL来存储报警服务产生的报警.在报警服务的组件中使用ADO接口 客户方有两台计算机,一台计算机A用来组态,且可以对设备进行调试,操作系统是Win7 64bit 专业版,安装了VS2 ...
- 捉虫记:SHGetSpecialFolderPath返回错误码为2
通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的 ...
- 一次MySQL(INNODB存储引擎) 死锁捉虫记
前言 任何系统不管在什么阶段都需要关注生产环境错误日志,最近几个月内,发现偶尔会出现数据库死锁情况.以前碰到的数据库类错误大部分是SQL语法造成的错误,来到新东家之后才第一次碰到死锁情况,以前是搞游戏 ...
- Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8201936 在前文中,我们简要介绍了Andro ...
- .NET对象与Windows句柄(三):句柄泄露实例分析
在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子.例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象, ...
- .NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子
上一篇文章介绍了句柄的基本概念,也描述了C#中创建文件句柄的过程.我们已经知道句柄代表Windows内部对象,文件对象就是其中一种,但显然系统中还有更多其它类型的对象.本文将简单介绍Windows对象 ...
随机推荐
- 鼠标滑过提示title
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1. ...
- CSS样式display:none和visibility:hidden的区别
同样是隐藏,display:none与visibility:hidden有什么区别呢? 虽然display:none与visibility:hidden都能达到隐藏可见元素的作用(视觉上),但事实上, ...
- jQueryr .on方法解析
.On() 其实.bind(), .live(), .delegate()都是通过.on()来实现的,.unbind(), .die(), .undelegate(),也是一样的都是通过.off()来 ...
- cron以及在laravel中使用cron
yum install vixie-cron yum install crontabs /bin/systemctl restart crond.service #启动服务 /bin/systemct ...
- jdbc之分页查询
分页查询作为一项十分重要的数据库查询技术,在很多web项目中都会要用到,当然移动开发中也是会涉及的. 一.分页查询的sql语句: ps:为了方便阐述,下面统一使用student表作为查询的表:colN ...
- Dapper.ColumnMapper 的使用
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; usin ...
- Delphi代码优化
文章编目 1. 字符串优化 1.1. 不重复初始化 1.2. 使用SetLength预分配长字符串(AnsiString) 1.3. 字符串与动态数组的线程安全(Thread Safety) 1.4. ...
- 《WPF程序设计指南》读书笔记——第4章 按钮与其他控件
1.Button类 using System; using System.Windows; using System.Windows.Media; using System.Windows.Input ...
- HashMap加入数据后,会自动根据首字母排序
1.Map<String, ArrayList<XX>> entityHashMap = new HashMap<>(); 然后增加一些数据,会发现根据String ...
- UI事件监听的击穿
什么是UI事件监听的击穿 在游戏视图中,有两个UI界面叠在一起的时候,单击一个空白处,却触发了被覆盖在下层了UI界面中的单击事件,这就是单击击穿了上层界面. 假设场景中放置了一个箱子,单击箱子会触发一 ...