Как отследить утечку объекта Windows USER?

У меня есть программа, которая пропускает объекты USER, которые можно увидеть в диспетчере задач. Есть ли способ определить, какой тип ресурса просачивается? Я использовал такие программы, как GDI View для утечек GDI, которые разбивают его по типам объектов. Есть ли что-нибудь подобное для объектов USER?

2 ответа

Решение

Есть отладчик, который называется windbg. Он может делать такие вещи, но кривая обучения ошеломляет.

Вы можете отследить утечки дескриптора окна, перехватив Create/DestroyWindow, а затем отследить переданный дескриптор. Таким образом, вы можете легко с помощью ETW отслеживать график в WPA, где лишние дескрипторы, которые еще не удалены, остаются вне.

См. http://geekswithblogs.net/akraus1/archive/2016/01/30/172079.aspx

С моей вилкой EasyHook это работает также для x64 на Win 8 и позже. Ниже приведено изображение, которое было создано с помощью ETWStackwalk.exe, который является частью моей вилки EasyHook. В WPA вы видите все открытые и закрытые окна, а также то, какие окна все еще открыты, проверив столбец AllocSize на значения> 0. Затем отфильтруйте события, у которых по-прежнему открыт дескриптор, и вы получите непосредственно стеки вызовов, где они были распределены, но никогда не освобождались, поэтому далеко.

введите описание изображения здесь

Если вам нужны кисти или шрифты, вам нужно расширить инструмент для методов, которые, как вы подозреваете, ответственны за утечку. Представленный подход способен решить любую утечку ресурсов, если вы знаете, какие методы могут вызвать утечку, и вы можете перехватить распределение ресурсов и бесплатные вызовы.

Другие вопросы по тегам