Мне интересно, можно ли использовать 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
, но это другой сценарий использования (если для этого нет какого-либо способа комбинирования или другого вектора использования, предоставьте информацию).