本人系统是win7 64位,待调试程序是32位。这里使用的方法是真机配合虚拟机同时调试的方法来找出句柄泄露的源码位置。

如果真机直接使用X64版本的windbg侦测句柄泄露时显示:

0:000:x86> !htrace -diff
Handle tracing information snapshot successfully taken.
0x1 new stack traces since the previous snapshot.
Ignoring handles that were already closed...
Outstanding handles opened since the previous snapshot:
--------------------------------------
Handle = 0x0000000000000030 - OPEN
Thread ID = 0x0000000000001240, Process ID = 0x00000000000010480x0000000076fcfc0a: ntdll!ZwCreateFile+0x000000000000000a
0x000000007480bfe3: wow64!whNtCreateFile+0x000000000000010f
0x00000000747fcf87: wow64!Wow64SystemServiceEx+0x00000000000000d7
0x000000007478276d: wow64cpu!ServiceNoTurbo+0x0000000000000024
0x00000000747fd07e: wow64!RunCpuSimulation+0x000000000000000a
0x00000000747fc549: wow64!Wow64LdrpInitialize+0x0000000000000429
0x0000000076fcae27: ntdll!LdrpInitializeProcess+0x0000000000001780
0x0000000076fc72f8: ntdll! ?? ::FNODOBFM::`string'+0x000000000002af20
0x0000000076fb2ace: ntdll!LdrInitializeThunk+0x000000000000000e
0x0000000077180056: ntdll32!ZwCreateFile+0x0000000000000012
0x000000007610bb7f: KERNELBASE!CreateFileW+0x000000000000035e
0x0000000076892345: kernel32!CreateFileWImplementation+0x0000000000000069
0x000000007689caa4: kernel32!CreateFileA+0x0000000000000037
--------------------------------------
Displayed 0x1 stack traces for outstanding handles opened since the previous snapshot.

如果真机直接使用X86版本的windbg侦测句柄泄露时显示:

0:000> !htrace -diff
Handle tracing information snapshot successfully taken.
0x1 new stack traces since the previous snapshot.
Ignoring handles that were already closed...
Outstanding handles opened since the previous snapshot:
--------------------------------------
Handle = 0x00000030 - OPEN
Thread ID = 0x00001058, Process ID = 0x000013780x047cf647: +0x047cf647
0x047d9398: +0x047d9398
0x044cc813: +0x044cc813
0x76fcfc0a: +0x76fcfc0a
0x7480bfe3: +0x7480bfe3
0x747fcf87: +0x747fcf87
0x7478276d: +0x7478276d
0x747fd07e: +0x747fd07e
0x747fc549: +0x747fc549
0x76fcae27: +0x76fcae27
0x76fc72f8: +0x76fc72f8
0x76fb2ace: +0x76fb2ace
0x77180056: ntdll!ZwCreateFile+0x00000012
0x7610bb7f: KERNELBASE!CreateFileW+0x0000035e
0x76892345: kernel32!CreateFileWImplementation+0x00000069
0x7689caa4: kernel32!CreateFileA+0x00000037
--------------------------------------
Displayed 0x1 stack traces for outstanding handles opened since the previous snapshot.

总之两个版本都不能有效的显示正确的堆栈,下面讲解一种方法:虚拟机XP SP3系统下侦测句柄泄露,真机下配合定位源码位置。

准备工作:

1.下载windbg,现在的windbg没有单独的下载地址了,而是和SDK一起打包发行的,Download and Install Debugging Tools for Windows 。

根据需要选择下载,下载或在线安装的时候选择“Debugging Tools for Windows”即可,下载的比较慢。

下载安装成功后配置符号路径:srv*c:\symbols*http://msdl.microsoft.com/download/symbols

2.在虚拟机里(本人虚拟机系统XP SP3)里进行句柄泄露的侦测。

首先用windbg载入目标程序,!htrace -enable开启句柄跟踪开关。

某个时刻创建一次句柄快照:!htrace -snapshot

继续运行后进行一次句柄快照对比:!htrace -diff

两次的句柄快照对比出期间打开或者关闭的句柄:

0:002> !htrace -diffHandle tracing information snapshot successfully taken.
0x4 new stack traces since the previous snapshot.
Ignoring handles that were already closed...
Outstanding handles opened since the previous snapshot:
--------------------------------------
Handle = 0x000005a0 - OPEN
Thread ID = 0x000001e4, Process ID = 0x000004e4--------------------------------------
Displayed 0x1 stack traces for outstanding handles opened since the previous snapshot.

可以看到中间有句柄0x000005a0被打开了,可能是一次句柄泄露但是也不一定,需要继续分析,使用!htrace 0x000005a0命令显示创建该句柄的堆栈:

0:002> !htrace 0x000005a0 --------------------------------------
Handle = 0x000005a0 - OPEN
Thread ID = 0x00000290, Process ID = 0x000004e40x7606a0ee: SETUPAPI!EnablePnPPrivileges+0x0000008b
0x76069ffd: SETUPAPI!PnPGetGlobalHandles+0x0000001d
0x7606bcd6: SETUPAPI!CM_Locate_DevNode_ExW+0x00000078
0x7606befe: SETUPAPI!pSetupOpenAndAddNewDevInfoElem+0x00000045
0x7606b594: SETUPAPI!SetupDiGetClassDevsExW+0x00000459
0x7606d641: SETUPAPI!SetupDiGetClassDevsA+0x0000003d
0x006fcf86: test!cclass1::func1+0x00000056
0x005e617f: test!cclass3::func2+0x0000018f
0x005df7c6: test!cclass2::func3+0x00000056
0x005de4b9: test!Func+0x00000039
--------------------------------------

句柄是在用户代码:test!cclass1::func1+0x00000056处创建的,使用lsa命令显示源码位置。

由于是在虚拟机中调试的没有源码,这个时候在真机中用X86版本的windbg载入目标程序,并使用lsa命令即可显示源码位置。

0:000> lsa test!cclass1::func1+0x0000005664: 65:     hDevInfo = SetupDiGetClassDevs(NULL,66:         0,67:         0,
>   68:         DIGCF_PRESENT|DIGCF_ALLCLASSES);69: 70:     if(hDevInfo == INVALID_HANDLE_VALUE)71:     {72:         return FALSE;73:     }

然后检查下这块代码有无释放句柄即可,经检查后面代码没有调用SetupDiDestroyDeviceInfoList释放句柄,故而造成句柄泄露。

转载于:https://www.cnblogs.com/daxingxing/archive/2012/06/07/2540086.html

windbg调试句柄泄露相关推荐

  1. windbg检测句柄泄露(定位到具体代码)

    原文 http://blog.csdn.net/yockie/article/details/40603511 摘要: windbg attach到目标进程 !htrace -enable 该命令会自 ...

  2. windbg调试实例(4)--句柄泄露

    同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心.鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里: ...

  3. Windows 句柄泄露学习总结

    句柄泄露实例分析 http://www.cnblogs.com/Leo_wl/p/5397274.html 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有 ...

  4. umdh windbg分析内存泄露

    A.利用工具umdh(user-mode dump heap)分析 1设置gflags.exe标志 r Gflags标志设置好后,开启cmd 键入要定位内存泄露的程序gflags.exe /i mem ...

  5. windbg调试堆破坏

    堆破坏 所谓的堆破坏,是说没控制好自己的指针,把不属于你分配的那块内存给写覆盖了.这块内存可能是你程序的数据,也可能是堆的管理结构.那么这个会导致怎样的后果呢?可能的情况我们来yy下 把程序里的计算结 ...

  6. windbg调试HEAP

    HEAP的概念 堆栈堆栈,在操作系统内存中有两种存储空间,一个是堆,一个是栈.堆主要用于存储用户动态分配的变量,而栈呢,则是存储我们程序过程中的临时变量.当然栈的作用远不止用作存储变量,但这不是我们这 ...

  7. windbg调试驱动学习总结

    简单驱动编写与windbg调试 http://trustsec.blog.51cto.com/305338/64694/ 一.驱动编写 随着对windows系统的深入研究,越来越多的内核方面的知识被挖 ...

  8. 使用Windbg定位内存泄露

    在网上看了两篇文章,整理一下,大致内容如下: 场景一:运行Debug版本程序,用Windbg attach 上去,等程序退出时,基于内存泄露报告,定位内存泄露的位置. 首先使用windbg工具gfla ...

  9. 博客摘录「 Windbg调试命令汇总」2023年4月15日

    目录 1.Windbg调试器介绍 2.Windbg版本说明 3.Windbg命令汇总 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/c ...

最新文章

  1. Python 捕获警告
  2. MAC下的反编译、反汇编和调试神器Hopper Disassembler
  3. autolisp统计相同元素个数_统计学习基础知识
  4. 21行满分代码:1039 到底买不买 (20分)
  5. iframe懒加载_前端常见问题
  6. VS2010附加进程调试DLL时断点无法断下的解决方法
  7. C++:vector中的resize()函数 VS reserve()函数
  8. 学习笔记-AngularJs(十)
  9. 前端if else_应该记录的一些项目代码(前端)
  10. 浙江省高校计算机等级考试三级考什么容易,浙江省高校计算机等级考试大纲(三级)(3)...
  11. 多线程-ReentrantLock
  12. 坐标或测量值超出范围
  13. oracle 9 创建数据库,Oracle 9i创建数据库(转)
  14. 宝宝的成长脚印9/29
  15. 【上采样问题】将浮点运算转换成整数运算
  16. 考研数学备考思路和计划制定
  17. xps15u盘装linux,戴尔XPS 15 9575笔记本安装win10系统的操作教程
  18. ubuntu16.04/20.04 xfce4以及windows下面使用护眼软件redshift
  19. 华为的冬天----任正非
  20. WinMerge的使用(代码相同却提示有差异)。

热门文章

  1. python setup.py卸载
  2. 麦克纳姆轮辊子滚动速度分析
  3. 华中科技大学计算机暑期夏令营,2019年华中科技大学计算机专业夏令营
  4. linux oracle异常,Linux上oracle常见安装异常总结
  5. cheat engine 将选中目标的函数_EXCEL函数与公式剖析:IF
  6. c++题目大坑:分数化小数
  7. 最长公共子串(10分)
  8. 文本属性之文本缩进(CSS、HTML)
  9. vue draggable 火狐拖拽搜索bug解决
  10. input 禁止输入特殊字符