Устранение утечек памяти в расширениях Windows Explorer - PullRequest
2 голосов
/ 03 апреля 2011

Приветствую всех,

Я разработчик довольно большого расширения C # для Windows Explorer.Как вы можете себе представить, здесь задействовано много P / Invoke, и, к сожалению, я подтвердил, что где-то происходит утечка неуправляемой памяти.Тем не менее, я подхожу к вопросу о том, как найти утечку.Я попытался выполнить это полезное руководство , в котором говорится, что нужно использовать WinDBG.Но когда я пытаюсь использовать! Heap, он не дает мне этого сделать, потому что у меня нет файлов .PDB для explorer.exe (и, очевидно, файлов открытых символов недостаточно).Помощь

1 Ответ

2 голосов
/ 03 апреля 2011

Я использовал много раз UMDH с очень хорошими результатами. В руководстве, которое вы упомянули при описании WinDbg, используется тот же метод, что и в UMDH, основанный на способности кучи отладки записывать трассировки стека для всех выделений. Единственное отличие состоит в том, что UMDH делает это автоматически - вы просто запускаете umdh из командной строки, и он создает снимок всех текущих выделений. Обычно вы повторяете снимки два или более раз, а затем вычисляете «дельту» между двумя снимками (также используя umdh.exe). Информация в файле «delta» дает вам все новые распределения, которые происходят между вашими снимками, отсортированные по размеру распределения.

UMDH также нужны символы. Для ntdll.dll вам понадобятся как минимум символы (там же находится реализация кучи). Публичные символы, доступные на общественных символах от http://msdl.microsoft.com/download/symbols, будут работать нормально.

Убедитесь, что вы используете правильную разрядность файла umdh.exe. Explorer.exe является 64-разрядным в 64-разрядной ОС, поэтому, если ваша ОС является 64-разрядной, вам нужно использовать 64-разрядный файл umdh.exe - то есть загрузить соответствующую разрядность средств отладки Windows.

...