4

我想知道是否可以使用 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;
}

在构建此示例并在 WinDbg 中启动它之后,是否可以在行上方的示例中获取分配句柄的调用堆栈:

HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL);

我正在用!handle命令四处寻找,但到目前为止没有任何进展。

这与处理泄漏分析有关。我知道,!htrace -enable但这!htrace -diff是一个不同的使用场景(除非有某种组合方式或其他使用向量,请提供信息)。

4

1 回答 1

5

找到了似乎是一个解决方案:

  1. 通过使用启用跟踪!htrace -enable
  2. 运行程序并等待句柄泄漏
  3. 检查程序的句柄和峰值一以进行分析!htrace <handle>
0:001> !htrace -启用
启用句柄跟踪。
处理跟踪信息快照已成功拍摄。
0:001>克
0:001> !句柄
...

处理7d8
  类型事件
...
111个把手
类型计数
事件 103
文件 3
端口 1
目录 2
窗口站 1
键控事件 1
0:001> !htrace 7d8
--------------------------------------
句柄 = 0x000007d8 - 打开
线程 ID = 0x00000fc4,进程 ID = 0x000017a8

0x0040106d:TestMemHandleLeak!wmain+0x0000006d
0x0040151b:TestMemHandleLeak!__tmainCRTStartup+0x0000010f
0x7c817077: kernel32!BaseProcessStart+0x00000023

--------------------------------------
已解析 0x64 堆栈跟踪。
转储 0x1 堆栈跟踪。

为了获得该地址的代码行,我做了:

0:001> ln TestMemHandleLeak!wmain+0x0000006d
f:\temp\windowsapplication3\testmemhandleleak\testmemhandleleak.cpp(22)
于 2009-08-19T16:08:32.500 回答