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)