windbg调试实例(4)--句柄泄露
同事介紹了一篇調(diào)試句柄泄露的blog文章,今天有空看了一下,這家伙用視頻的方式錄下整個(gè)調(diào)試的過程,學(xué)習(xí)一目了然,真是有心。鑒于學(xué)習(xí)的過程總結(jié)一下能加深記憶,所以我這里做個(gè)記錄,感興趣的朋友可以看這里:http://blogs.msdn.com/ntdebugging/archive/2007/09/14/talkbackvideo-understanding-handle-leaks-and-how-to-use-htrace-to-find-them.aspx
??? 如果你不喜歡英文,那就可以看下面我蹩腳的解釋了。
1、用c++寫一個(gè)句柄泄露的樣例程序:
?
#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);//這里只打開但是沒關(guān)閉句柄
}
代碼非常簡(jiǎn)單,明眼人一看就能看出哪里有問題,那么程序編譯后用windbg怎么調(diào)出來呢??
2、windbg調(diào)試
1)找到windbgs安裝目錄下的gflags.exe工具,該工具可用來打開windows自帶的一些調(diào)試選項(xiàng),具體gflags.exe的詳細(xì)使用可以查看windbg幫助;
這里我們?cè)O(shè)置勾上application verifiwer,該工具主要可用來對(duì)程序做一些穩(wěn)定性的檢測(cè),本次調(diào)試主要用于保存棧的相關(guān)信息。同時(shí)設(shè)置stack backtrace即棧的大小為10.
?
2)運(yùn)行windbg,打開第一步編譯的程序,并使其跑起來;此時(shí)你查看任務(wù)管理器中的句柄信息,會(huì)發(fā)行相應(yīng)進(jìn)程句柄一直在增加。
3)windbg用ctrl+break命令中斷進(jìn)程運(yùn)行,用!htrace -enable命令開啟句柄檢測(cè);htrace提供了進(jìn)行句柄相關(guān)檢測(cè)的命令,可查看windbg幫助。
同時(shí)用g命令讓程序運(yùn)行。
4)再次中斷進(jìn)程,使用!htrace -snapshot命令,獲得此時(shí)進(jìn)程句柄的鏡像。并再次讓程序運(yùn)行。
5)第三次中斷進(jìn)程運(yùn)行,我們?cè)偈褂?#xff01;htrace -diff命令獲得當(dāng)前句柄狀態(tài)與第4步 snapshot鏡像句柄的差異;
我們可以發(fā)現(xiàn):新增很多打開的句柄,平常情況下這些打開的句柄有可能不是泄露,需要具體分析,但是本次示例程序太簡(jiǎn)單,所以剛好所有打開的句柄都屬于泄露的。
6)我們使用lsa?傳遞指定位置對(duì)應(yīng)的代碼,lsa??handlew2!fun4+0x0000002e
?
到這里,我們就找到了泄露句柄的函數(shù),真是神奇啊。
轉(zhuǎn)載于:https://www.cnblogs.com/xumaojun/p/8544156.html
總結(jié)
以上是生活随笔為你收集整理的windbg调试实例(4)--句柄泄露的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 100. Same Tree同样的树
- 下一篇: 用C#开发较完整的Windows任务管理