2009-08-19 2 views
3

Мне интересно, можно ли использовать WinDbg для kwown 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 есть возможность получить стек вызовов, что выделенные ручки, в образце выше линии:

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. 

И чтобы получить строку кода, что Адресная с Я:

 
0:001> ln TestMemHandleLeak!wmain+0x0000006d 
f:\temp\windowsapplication3\testmemhandleleak\testmemhandleleak.cpp(22) 
Смежные вопросы