• 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

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

    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

     

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

  • 相关阅读:
    转载 listview的一种常用布局
    转载 Android gallery实现图片的左右循环旋转
    转载 android 所有布局属性和UI控件
    转载 android 支持展开/收缩功能的列表控件
    svn实现文件/目录的共享
    linux 下命令行修改IP地址
    oracle 10g数据库闪回配置与使用
    Oracle数据库实例启动不了怎么办?
    oracle 权限列表
    apache 配置虚拟目录
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8544156.html
Copyright © 2020-2023  润新知