捉虫记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对象 ...
随机推荐
- Json对象序列化与反序列化
如果后台的参数数对象,需要在前台传入: JS代码: //创建JS对象 var CUTTING_TABLET_MO = new Object(); CUTTING_TABLET_MO.CUTTING_T ...
- DTCMS自定义标签,获取所有栏目以及获得二级子栏目导航
取得二级栏目 DTcms.Web.UI\Label\category.cs中 get_category_child_list 返回当前所有子栏目 DTcms.Web.UI\Label\category ...
- jquery横向滚动条
此代码献给wendy 由于工作太忙,下次再整理成插件调用,先记录下来,欢迎同学们提意见. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- JavaScript 风格指导(Airbnb版)
JavaScript 风格指导(Airbnb版) 用更合理的方式写 JavaScript 原文 翻译自 Airbnb JavaScript Style Guide . 目录 类型 引用 对象 数组 解 ...
- 在asp.net mvc中如何使用Grid++ Report (锐浪报表)
在asp.net mvc中如何使用Grid++ Report (锐浪报表) 在cshtml,razor中的处理方法 以官方的asp.net(csharp)中的第一个示例"1a.简单表格&qu ...
- (转)Qt Model/View 学习笔记 (二)——Qt Model/View模式举例
Qt Model/View模式举例 Qt提供了两个标准的models:QStandardItemModel和QDirModel.QStandardItemModel是一个多用途的model,可用于表示 ...
- 详解Javascript中的Array对象
基础介绍 创建数组 和Object对象一样,创建Array也有2种方式:构造函数.字面量法. 构造函数创建 使用构造函数的方式可以通过new关键字来声明,如下所示: 12 var arr = new ...
- 【dapper】.net平台下的框架
http://www.cnblogs.com/yipu/archive/2012/11/21/2780199.html Method Duration Remarks Hand coded (usin ...
- Entity Framework 安装出现问题
Entity Framework 详情请看: http://ulfqbpl.blog.163.com/blog/static/8778355220126272473276/
- how to get sharepoint lookup value
SPFieldLookup lookUp1 = properties.ListItem.ParentList.Fields.GetField("Leave_x0020_Type") ...