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

简介: 同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心。鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里:http://blogs.msdn.com/ntdebugging/archive/2007/09/14/talkbackvideo-understanding-handle-leaks-and-how-to-use-htrace-to-find-them.aspx    如果你不喜欢英文,那就可以看下面我蹩脚的解释了。

同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心。鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里:http://blogs.msdn.com/ntdebugging/archive/2007/09/14/talkbackvideo-understanding-handle-leaks-and-how-to-use-htrace-to-find-them.aspx

    如果你不喜欢英文,那就可以看下面我蹩脚的解释了。

1、用c++写一个句柄泄露的样例程序:

 

#include "stdafx.h"
#include <windows.h>
void fun1(void);
void fun2(void);
void fun3(void);
void fun4(void);
int main(int argc, char* argv[])
{
      while(1)
      {
            fun1();
            fun2();
            Sleep(100);
      }
      return 0;
}
void fun1(void)
{
      fun3();
}
void fun2(void)
{
      fun4();
}
void fun3(void)
{
      HANDLE hEvent;
      hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
      CloseHandle(hEvent);
}
void fun4(void)
{
      HANDLE hEvent2;
      hEvent2 = CreateEvent(NULL,TRUE,TRUE,NULL);//这里只打开但是没关闭句柄
}

代码非常简单,明眼人一看就能看出哪里有问题,那么程序编译后用windbg怎么调出来呢? 

2、windbg调试

1)找到windbgs安装目录下的gflags.exe工具,该工具可用来打开windows自带的一些调试选项,具体gflags.exe的详细使用可以查看windbg帮助;

这里我们设置勾上application verifiwer,该工具主要可用来对程序做一些稳定性的检测,本次调试主要用于保存栈的相关信息。同时设置stack backtrace即栈的大小为10.

 

2)运行windbg,打开第一步编译的程序,并使其跑起来;此时你查看任务管理器中的句柄信息,会发行相应进程句柄一直在增加。

3)windbg用ctrl+break命令中断进程运行,用!htrace -enable命令开启句柄检测;htrace提供了进行句柄相关检测的命令,可查看windbg帮助。

同时用g命令让程序运行。

4)再次中断进程,使用!htrace -snapshot命令,获得此时进程句柄的镜像。并再次让程序运行。

5)第三次中断进程运行,我们再使用!htrace -diff命令获得当前句柄状态与第4步 snapshot镜像句柄的差异;

我们可以发现:新增很多打开的句柄,平常情况下这些打开的句柄有可能不是泄露,需要具体分析,但是本次示例程序太简单,所以刚好所有打开的句柄都属于泄露的。

6)我们使用lsa 传递指定位置对应的代码,lsa  handlew2!fun4+0x0000002e

 

到这里,我们就找到了泄露句柄的函数,真是神奇啊。

目录
相关文章
|
7月前
|
C++ Windows
使用 windbg gflags dumpbin 排查应用程序启动错误
使用 windbg gflags dumpbin 排查应用程序启动错误
|
3月前
|
Arthas 测试技术
错误提示表明Arthas无法打开目标进程的socket文件
错误提示表明Arthas无法打开目标进程的socket文件
50 2
|
6月前
|
缓存 小程序 开发工具
解决微信开发工具的调试器加载错误,从任务栏打开工具可能导致该问题,请不要从任务栏启动工具。 和调试器控制台显示为空,刷新出不来的问题。
解决微信开发工具的调试器加载错误,从任务栏打开工具可能导致该问题,请不要从任务栏启动工具。 和调试器控制台显示为空,刷新出不来的问题。
201 0
|
6月前
|
监控
10.2 调试事件获取DLL装载
理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用`LOAD_DLL_DEBUG_EVENT`这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实现进程模块加载的监控。
54 0
10.2 调试事件获取DLL装载
|
7月前
|
存储 安全 API
调试实战 | 通过转储文件分析程序无响应之使用 windbg + IDA 逆向篇
调试实战 | 通过转储文件分析程序无响应之使用 windbg + IDA 逆向篇
|
7月前
|
Windows
|
7月前
|
Windows
调试实战——使用windbg调试DLL卸载时的死锁
dll 卸载时死锁了,不怕,windbg 来解决
MFC下运行控制台不显示黑屏
MFC下运行控制台不显示黑屏
75 0
|
安全 IDE 开发工具
VS2010调试X64项目工程时,报错提示VS调试监视器(MSVSMON.EXE)未能启动,解决方案。
VS2010调试X64项目工程时,报错提示VS调试监视器(MSVSMON.EXE)未能启动,解决方案。
442 0
|
C++ Windows
windbg调试实例(4)--句柄泄露[转]
同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心。鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里:http://blogs.msdn.com/ntdebugging/archive/2007/09/14/talkbackvideo-understanding-handle-leaks-and-how-to-use-htrace-to-find-them.aspx     如果你不喜欢英文,那就可以看下面我蹩脚的解释了。
1291 0