Я участвую в различных проектах C ++ (в основном использующих MSVC6 вплоть до MSVC10), в которых мы недавно обнаружили несколько утечек дескрипторов (дескрипторы потоков, заданные функцией CreateThread
).Я подозреваю, что есть и множество других дескрипторов, и я хотел бы интегрировать тест, который проверяет, что в наших результатах ночных тестов нет утечек.
Моя идея состояла в том, чтобы разработать DLL, инструментысоответствующие функции kernel32.dll (CreateThread, OpenProcess, CreateProcess и многие другие), а также функция CloseHandle
.Затем DLL для каждого полученного дескриптора запоминает обратную трассировку.В конце процесса DLL распечатывает все обратные следы дескрипторов, которые не были закрыты для какого-либо файла журнала, который затем может быть проанализирован тестовой средой.
Это, конечно, также приведет к обратным следамдля всех дескрипторов, которые все еще доступны (так что технически они не просочились - возможно, автор предполагал, что ОС исправит их, когда процесс завершится), но я думаю, что их закрытие явно не повредит - тем более, что у нас уже есть некоторые хорошие RAII обертки для этого материала, мы просто не используем его так, как должны.
Теперь мне интересно - это кажется довольно простым подходом;может быть, кто-то здесь уже знает о библиотеке, которая уже делает это?