Windows 句柄分配在哪里?
Windows 句柄分配在哪里?,windows,windbg,resource-leak,Windows,Windbg,Resource Leak,我想知道是否可以使用WinDbg来填充导致句柄分配的调用堆栈
例如:
#include <windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Press ENTER to leak handles." << endl;
_getch
我想知道是否可以使用WinDbg来填充导致句柄分配的调用堆栈
例如:
#include <windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Press ENTER to leak handles." << endl;
_getch();
cout << "Leaking handles" << endl;
for (int i = 0; i < 100; ++i)
{
HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);
if (h != NULL)
{
cout << ".";
}
}
cout << "Handles leaked. Press ENTER to exit." << endl;
_getch();
return 0;
}
我正在用到处乱翻!handle
命令,但到目前为止没有进展
这与处理泄漏分析有关。我知道!htrace-启用
和!htrace-diff
但这是一个不同的使用场景(除非有某种方式组合或使用其他向量,请提供信息)。找到了一个解决方案:
使用启用跟踪!htrace-启用
运行程序并等待句柄泄漏
用检查程序句柄和峰值句柄,以进行分析!htrace
0:001> !htrace-启用
已启用句柄跟踪。
处理已成功获取的跟踪信息快照。
0:001>g
0:001> !手柄
...
手柄7d8
类型事件
...
111手柄
类型计数
事件103
文件3
端口1
目录2
窗口站1
关键事件1
0:001> !htrace 7d8
--------------------------------------
手柄=0x000007d8-打开
线程ID=0x00000fc4,进程ID=0x000017a8
0x0040106d:TestMemHandleLeak!wmain+0x0000006d
0x004015B:TestMemHandleLeak__tmainCRTStartup+0x000001f
0x7c817077:内核32!BaseProcessStart+0x00000023
--------------------------------------
已分析0x64堆栈跟踪。
转储0x1堆栈跟踪。
为了得到那个地址的代码行,我做了:
0:001> ln TestMemHandleLeak!wmain+0x0000006d
f:\temp\windowsapplication3\testmemhandleleak\testmemhandleleak.cpp(22)
0:001>ln TestMemHandleLeak!wmain+0x0000006d
f:\temp\windowsapplication3\testmemhandleleak\testmemhandleleak.cpp(22)
0:001> !htrace -enable
Handle tracing enabled.
Handle tracing information snapshot successfully taken.
0:001> g
0:001> !handle
...
Handle 7d8
Type Event
...
111 Handles
Type Count
Event 103
File 3
Port 1
Directory 2
WindowStation 1
KeyedEvent 1
0:001> !htrace 7d8
--------------------------------------
Handle = 0x000007d8 - OPEN
Thread ID = 0x00000fc4, Process ID = 0x000017a8
0x0040106d: TestMemHandleLeak!wmain+0x0000006d
0x0040151b: TestMemHandleLeak!__tmainCRTStartup+0x0000010f
0x7c817077: kernel32!BaseProcessStart+0x00000023
--------------------------------------
Parsed 0x64 stack traces.
Dumped 0x1 stack traces.
0:001> ln TestMemHandleLeak!wmain+0x0000006d
f:\temp\windowsapplication3\testmemhandleleak\testmemhandleleak.cpp(22)