作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一。软件在主体功能开发完成后会经历各个阶段的测试,才会被发布。在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软件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程序句柄泄露的上下文环境的更多相关文章

  1. 捉虫记(四)线程安全导致的HighCpu

    一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...

  2. PHP(SentCMS)网站 “新手”捉虫记

    我拖着疲惫的身躯,努力打开眼皮在写...... 昨晚弄到12点,我感觉应该弄好了. 故事开头是这样的:我呢朋友有个网站需要开发,我当时没时间就包给外面的公司了,由于外面公司维护费用比较贵. 那么网站维 ...

  3. MapReduce全局变量之捉虫记

    全局变量 写MapReduce程序时候,有时候须要用到全局变量,经常使用的全局变量实现由三种方式: 通过作业的Configuration传递全局变量.作业初始化的时候.conf.set(),须要的时候 ...

  4. [原]捉虫记3:_ConectionPtr指针调用open失败

    背景 产品使用MySQL来存储报警服务产生的报警.在报警服务的组件中使用ADO接口 客户方有两台计算机,一台计算机A用来组态,且可以对设备进行调试,操作系统是Win7 64bit 专业版,安装了VS2 ...

  5. 捉虫记:SHGetSpecialFolderPath返回错误码为2

    通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的 ...

  6. 一次MySQL(INNODB存储引擎) 死锁捉虫记

    前言 任何系统不管在什么阶段都需要关注生产环境错误日志,最近几个月内,发现偶尔会出现数据库死锁情况.以前碰到的数据库类错误大部分是SQL语法造成的错误,来到新东家之后才第一次碰到死锁情况,以前是搞游戏 ...

  7. Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8201936 在前文中,我们简要介绍了Andro ...

  8. .NET对象与Windows句柄(三):句柄泄露实例分析

    在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子.例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象, ...

  9. .NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子

    上一篇文章介绍了句柄的基本概念,也描述了C#中创建文件句柄的过程.我们已经知道句柄代表Windows内部对象,文件对象就是其中一种,但显然系统中还有更多其它类型的对象.本文将简单介绍Windows对象 ...

随机推荐

  1. Adobe Illustrator CS6 绿色简体中文版下载地址

    一.Adobe Illustrator CS6 简体中文精简绿色优化版:1.由官方简体中文正式版制作而成,只需要执行一次快速安装即可使用.已经注册,非tryout版,支持x64位系统.2.精简了Ext ...

  2. HTTP Error 500.21解决方案

    Windows 7 IIS (HTTP Error 500.21 - Internal Server Error)解决方案   今天在测试网站的时候,在浏览器中输入http://localhost/时 ...

  3. MAC机中安装RUBY环境

    在安装CocoaPods之前要先配置好RUBY环境,本文就怎么安装RUBY的环境进行一总结.安装Ruby环境首先需要安装Xcode然后需要安装Homebrew,接下来需要安装RVM最后安装Ruby环境 ...

  4. Unity学习笔记(1):认识Unity

    Unity是什么? Unity是patterns & practices团队开发的一个轻量级.可扩展的依赖注入容器,具有如下的特性: 它提供了创建(或者装配)对象实例的机制,而这些对象实例可能 ...

  5. JS实现图片翻书效果示例代码

    js 图片翻书效果.  picture.html  <html xmlns="http://www.w3.org/1999/xhtml">  <head>  ...

  6. thinkphp 使用过程中遇到的一个小函数

    1.实现导出Excel文件,并在导出的文件中显示图片 //导出 public function push(){ $goods_list=M('Dajia')->select(); $data = ...

  7. Windows.Andy.Code4App.dll Win8.1/WP8.1通用类库@ver1.0.1

    在上篇 Windows.Andy.Code4App.dll  Win8.1/WP8.1通用类库@ver1.0.0 已经对Win8.1和WP8.1部分扩展通用类库做了说明,这篇继续对通用类库做扩展.写的 ...

  8. ios 基于CAEmitterLayer的雪花,烟花,火焰,爱心等效果demo(转)

    转载自:http://blog.csdn.net/mad2man/article/details/16898369 分类: cocoa SDK2013-11-23 11:52 388人阅读 评论(0) ...

  9. QR code 金庸小说体(二)

    传说 在二维码世纪,流传着这样一个传说,long long ago,武林一片混乱,这时魔教二长老创立了一门绝世武功——QR code,随后称霸武林.但同时也遭到武林中人的觊觎和反抗,各大武林正派掌门人 ...

  10. tar 解压缩命令

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...