我想知道是否可以使用WinDbg来解决导致分配句柄的callstack。
例如:
#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;
}
构建此示例并在WinDbg中启动后,可以在行上方的示例中获取分配句柄的callstack:
HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);
我正在寻找!handle
命令但到目前为止没有任何进展。
这与处理泄漏分析有关。我知道!htrace -enable
和!htrace -diff
但这是一种不同的使用方案(除非有某种方法可以组合或使用其他用法向量,请提供信息)。
答案 0 :(得分:4)
找到了似乎是一个解决方案:
!htrace -enable
!htrace <handle>
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)