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).