处理分配在哪里?

时间:2009-08-19 15:59:47

标签: windows windbg resource-leak

我想知道是否可以使用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但这是一种不同的使用方案(除非有某种方法可以组合或使用其他用法向量,请提供信息)。

1 个答案:

答案 0 :(得分:4)

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

  1. 使用!htrace -enable
  2. 启用跟踪
  3. 运行程序并等待句柄泄漏
  4. 检查程序的句柄和峰值,以便使用!htrace <handle>
  5. 进行分析
    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)