Windbg定位句柄泄漏,亲测好用

 1 void NormalFunc()
 2 {
 3     HANDLE hEvent;
 4     hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
 5     CloseHandle(hEvent);
 6 }
 7  
 8 void HandleLeakFunc()
 9 {
10     HANDLE hEvent;
11     hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
12     //CloseHandle(hEvent);        //有句柄泄露
13 }
14  
15 int main()
16 {
17     while(1)
18     {
19         NormalFunc();
20         HandleLeakFunc();
21         Sleep(200);
22     }
23  
24     return 0;
25 }

主要命令如下:

!htrace -enable

!htrace -snapshot

//do something

!htrace -diff

 

1.windbg调试(文件必须是带调试信息的,pdb不可少)

(1)运行windbg,首先确定符号表地址填写OK了。

(2)我们选择"Open Executable"再选择上述测试用例生成的exe,可能在实际工程中经常是"Attach to a process"。再看任务管理器会发现这个进程的句柄数飙升:

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

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

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

 

 

(6)输出很多打开的句柄,需要具体情况具体分析,最好对照代码来看。这里是测试,所以比较简单,一眼就看出来了。

(7)使用lsa 传递指定位置对应的代码,lsa Lab2010_2!HandleLeakFunc+0x00000012

 

posted @ 2019-04-17 11:32  Werial  阅读(719)  评论(0)    收藏  举报