同事介绍了一篇调试句柄泄露的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

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

转载于:https://www.cnblogs.com/xumaojun/p/8544156.html

windbg调试实例(4)--句柄泄露相关推荐

  1. windbg调试句柄泄露

    本人系统是win7 64位,待调试程序是32位.这里使用的方法是真机配合虚拟机同时调试的方法来找出句柄泄露的源码位置. 如果真机直接使用X64版本的windbg侦测句柄泄露时显示: 0:000:x86 ...

  2. Windows 句柄泄露学习总结

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

  3. windbg调试驱动学习总结

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

  4. windbg调试堆破坏

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

  5. windbg调试HEAP

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

  6. Windbg调试学习

    一.为什么学习使用Windbg调试 Windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较 ...

  7. 使用WinDbg调试SQL Server——入门

    这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题 ...

  8. 使用WinDBG调试查看C#内存转储文件

    使用WinDBG调试查看C#内存转储文件 有时候我们想查看一个正在运行的程序内存中的数据,可以在任务管理器将内存状态保存为转储文件,并使用WinDBG验证,这里我们来试试: 0.安装WinDBG 1. ...

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

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

最新文章

  1. 博客作业05--查找
  2. Effective Python 小笔记之 zip 函数
  3. java.net.uri,java.net.uri
  4. node经验总结(一)
  5. Word 技术篇-段落的前后间距单位磅改为行,行改为磅
  6. PPT快速制作精美3D柱状图
  7. mds聚类matlab,MDS图示聚类结果
  8. odata service authorization check in backend
  9. Gridview应用技巧——如何为行添加事件
  10. Spring Cloud源码分析(四)Zuul:核心过滤器
  11. python定义_python __xx__的定义和用处
  12. 不常用,但热门的IOS第三方库(转)
  13. 蓝桥杯 C语言 试题 算法训练 猴子分苹果
  14. abb880/580驱动程序,zmu程序图纸571/592/792需要
  15. 梅姐为什么没能拯救雅虎?
  16. ecshop二次开发_Logo和版权信息
  17. 安卓虚拟摄像头_谷歌AR新推强大功能:虚拟对象无缝嵌入,可与现实环境交互...
  18. Android9.0 网络框架之--Tethering 热点
  19. gradle project sync failed.please fix your project and try again-Android Studio3.1.2运行出错
  20. 乒乓球重拍轻拍怎么选

热门文章

  1. Android开发中如何设置不显示标题和设置全屏
  2. 转:让 ThinkPad 的中键加小红帽模拟鼠标滚轮
  3. java中解决脏读_java并发编程学习之脏读代码示例及处理
  4. css div 边缘渐变,围绕div的CSS3渐变边框
  5. java static修饰方法_浅析Java中static修饰符
  6. 【附赠PPT】 KubeMeet 成都站回顾:让云原生应用交付和管理变得更简单
  7. Knative 基于流量的灰度发布和自动弹性实践
  8. 计算机网络的拓扑结构主要有新型,计算机网络中主要拓扑结构有 ______。
  9. hyperic hq mysql_网络管理工具Hyperic HQ监控MySQL配置
  10. php 移动端隐藏引导页,移动端引导设计技巧1:前置的引导页