代码之家  ›  专栏  ›  技术社区  ›  Jorge Ferreira

在哪里分配了句柄?

  •  3
  • Jorge Ferreira  · 技术社区  · 17 年前

    我想知道是否可以使用windbg来Kwown导致句柄分配的调用堆栈。

    例如:

    #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 但这是一个不同的使用场景(除非有某种组合方法或其他使用向量,请提供信息)。

    1 回复  |  直到 17 年前
        1
  •  4
  •   Jorge Ferreira    17 年前

    找到了一个解决方案:

    1. 使用启用跟踪 !htrace -enable
    2. 运行程序并等待处理泄漏
    3. 检查程序的句柄,并使用peak one进行分析 !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)