Существует ли детектор утечки хэндлов, который можно подключить к существующему приложению?

Я участвую в различных C++ проектах (в основном использующих MSVC6 вплоть до MSVC10), в которых мы недавно обнаружили несколько утечек хэндлов (хэндлы потоков, передаваемые функцией CreateThread ). Я подозреваю, что существует множество других утечек хэндлов, и мне хотелось бы интегрировать тест, проверяющий отсутствие утечек хэндлов, в результаты наших ночных тестов.

Моя идея заключалась в разработке DLL, которая бы использовала соответствующие функции kernel32.dll (CreateThread, OpenProcess, CreateProcess и еще дюжину других), а также функцию CloseHandle . Затем DLL запоминает обратную трассировку для каждого получаемого хэндла. В конце процесса DLL будет печатать все обратные следы хэндлов, которые не были закрыты, в какой-нибудь лог-файл, который затем может быть разобран тестовым фреймворком.

Конечно, это также даст обратные следы для всех хэндлов, которые все еще доступны (так что технически они не просочились - возможно, автор предполагал, что ОС вернет их себе при завершении процесса), но я думаю, что явное их закрытие не помешает - тем более, что у нас уже есть несколько хороших RAII оберток для этих вещей, мы просто не используем их так часто, как следовало бы.

Теперь мне интересно - это кажется довольно простым подходом; может быть, кто-нибудь знает библиотеку, которая уже делает это?

6
задан Frerich Raabe 22 November 2011 в 08:11
поделиться