2009-08-19 6 views
3

Ich frage mich, ob es möglich ist, WinDbg zu verwenden, um den Callstack, der zur Zuweisung eines Handles führte, zu erkennen.Wo wurde der Griff zugewiesen?

Zum Beispiel:

#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; 
} 

Nachdem diese Probe den Aufbau und das Brennen in WinDbg oben ist es möglich, die Aufrufliste zu erhalten, die die Griffe zugeordnet, in der Probe über der Linie:

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

Ich stochere mit dem Befehl !handle herum, aber bisher keine Fortschritte.

Dies ist relevant für die Leckanalyse. Ich bin mir bewusst, !htrace -enable und !htrace -diff, aber dies ist ein anderes Nutzungsszenario (es sei denn, es gibt eine Möglichkeit zu kombinieren oder andere Nutzungsvektor dafür, bitte geben Sie Informationen).

Antwort

4

gefunden, was eine Lösung zu sein scheint:

  1. Spuren Aktivieren von !htrace -enable
  2. Führen Sie das Programm und warten Sie auf Handle-Lecks
  3. Überprüfen Sie die Griffe des Programms und Spitzen eine für die Analyse mit !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. 

Und die Zeile Code zu bekommen, dass addres s ich tat:

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