windbg调试-句柄泄露

Windbg内存泄漏问题的定位 文章目录1、搭建环境1.1 测试程序1.2 设置pdb路径和源码路径2、定位2.1 运行程序2.2 分析2.2.1 查看一下堆栈分配情况 1、搭建环境 1.1 测试程序 这里的测试程序是很简单的那种,凑合着用吧 #include "stdafx.h" void LeakMem() { while (true) { char *pTest = new char[512]; } } int _tmain(int argc, _TCHAR* argv[]) { LeakMem(); sys 阅读详情
同事介绍了一篇调试句柄泄露的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

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

VisDrone2019数据集实战:从下载到YOLO格式转换的完整指南 本文提供了一份完整的VisDrone2019数据集实战指南,详细介绍了从数据集下载、理解其独特的标注格式,到转换为YOLO模型可直接训练格式的全过程。通过清晰的代码示例和步骤讲解,帮助读者掌握处理复杂无人机视觉数据集的核心技能,为基于YOLO的目标检测模型训练做好准备。 阅读详情

相关推荐

在PyCharm中配置使用Anaconda环境

在PyCharm中配置使用Anaconda环境一、步骤1.Anaconda2.PyCharm总结 一、步骤 1.Anaconda 如未安装Anaconda可至其官网下载,学习使用个人版就可以了。 下载地址:https://www.anaconda.com/products/individual 1、打开Anaconda Navigator,点击Environments可以看到anaconda中已经有了默认的“base”环境,其中包含了大多数我们会用到的包,在PyCharm中可以直接使用该环境,而无需自行下载

TuckX的博客 19万+

windbg调试实例--句柄泄露

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

confusion 806

STM407ZET6+OV5640调试心得

最近一个项目用了STMF407ZET6 +OV5640,调试了好几天做些总结; STMF407ZET6 开发板用的是正点原子的开发板,OV5640摄像头用的是秉火摄像头; 这其中有一个大坑,开发板的DCMI接口跟摄像头的接口不一样,要重新用杜邦线进行连接; 本人是在正点原子的“”15,ATK-OV5640摄像头模块“”源码上进行修改的。

kingseacjh的专栏 8288

WinDbg 定位句柄泄漏问题

文章目录一、观察进程是否有句柄泄漏1、查看工具任务管理器查看句柄数procexp.exe查看进程句柄信息2、判断是否有句柄泄漏二、定位方法1、WinDbg分析句柄泄漏1.1 Event句柄泄漏1.1.1 代码示例1.1.2 一、观察进程是否有句柄泄漏 1、查看工具 使用任务管理器或Process Explorer(procexp.exe)工具可观察进程的句柄数。 任务管理器查看句柄数 procexp.exe查看进程句柄信息 2、判断是否有句柄泄漏 通常在程序运行稳定后,再观察句柄数有无增长,比如进程启动5分

过好每一天的女胖子 4487

Windbg 专题学习

1. WinDbg 查看内存的情况:        !address -summary  :  内存概况,显示当前内存的使用情况        !address : 查看内存的情况,详细情况        !dh [module addres] :  查看模块的内存详细信息        !heap 查看堆的使用情况        !address -f:stack  : 查看栈的使用情

Fly Follow the Heart 1080

WinDbg使用案例(用户模式)

WinDbg使用案例(用户模式)

weixin_43488529的博客 1057

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

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

weixin_34088838的博客 99

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

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

weixin_33725270的博客 111

windbg调试句柄泄露

本人系统是win7 64位,待调试程序是32位。这里使用的方法是真机配合虚拟机同时调试的方法来找出句柄泄露的源码位置。 如果真机直接使用X64版本的windbg侦测句柄泄露时显示: 0:000:x86> !htrace -diff Handle tracing information snapshot successfully taken. 0x1 new stack trace...

weixin_33920401的博客 187

WinDBG查找C++句柄泄露

代码中构造的mutex泄露,查找!htrace -diff输出内容,找到CPPWindowsProject1!使用lsa CPPWindowsProject1!点击WinDBG左上角的Go按钮继续执行,点击UI上的按钮造成泄露;htrace 或!C++代码(频繁点击About按钮导致Mutex句柄泄露)点击WinDBG左上角的Break按钮进入调试模式;windbg的lsa指令:显式指令对应的源码。找到147行的代码位置。

henreash的专栏 948

句柄泄露调试

句柄泄露调试(Handles Leak Debug) 一、概述 造成句柄泄露的主要原因,是进程在调用系统文件之后,没有释放已经打开的文件句柄。 对于句柄泄露,轻则影响某个功能模块正常运行,重则导致整个应用程序崩溃。在 Windows系统中, GDI 句柄上限是 12000 个,USER 句柄上限是 18000 个。 与 Windows 系统的设置不同,Linux 系统对进程可以调用的文件句柄

41万+

windbg检测句柄泄露 - 定位到具体代码

1、用c++写一个句柄泄露的样例程序: #include "stdafx.h" #include void fun1(void); void fun2(void); void fun3(void); void fun4(void); int main(int argc, char* argv[]) { while(1) { fun1(); fun2();

wwjshao的专栏 811

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

1.构造一个测试用例

华秋实的专栏 1万+

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

1、用c++写一个句柄泄露的样例程序: #include "stdafx.h" #include voidfun1(void); voidfun2(void); voidfun3(void); voidfun4(void); intmain(intargc, char* argv[]) { while(1) { fun1(); fun2(); Sleep

xiliang_pan的专栏 2031

如何洞察 C# 程序的 GDI 句柄泄露

一:背景 1. 讲故事前段时间有位朋友找到我,说他的程序界面操作起来很慢并且卡顿等一些不正常现象,从任务管理器看了下 GDI句柄 已经到 1w 了,一时也找不出什么代码中哪里有问题,让我帮忙看下,其实这种问题看内存dump作用不是很大,主要是写脚本很麻烦,这一篇我们就来简单聊聊如何洞察此类问题。二:如何洞察泄露 1. 一个测试小案例在 windows 上gdi的句柄类型有很多,比如:pen,fon...

dotNET跨平台 459

如何洞察 .NET程序 非托管句柄泄露

handle 泄露也是一个比较难搞的问题,难点在于生产环境可能不让你用 WinDbg 这种侵入方式,但问题还得要解决,必须创造条件上,当前除了 WinDbg 还没有找到其他方式,有机会再研究下吧。

一线码农的专栏 518
上一篇: WinDbg 常用命令
下一篇: C++内存分配方式
神牛BB
博客等级 码龄15年 28粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值