2009-08-19 57 views
3

我想知道是否可以使用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. 使用!htrace -enable
  2. 運行程序啓用跟蹤和等待句柄泄漏
  3. 檢查程序的手柄和峯值一個與!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. 

而得到的代碼行那個ADDRES我做了:

 
0:001> ln TestMemHandleLeak!wmain+0x0000006d 
f:\temp\windowsapplication3\testmemhandleleak\testmemhandleleak.cpp(22)