Отслеживание утечек COM-интерфейса / SysAlloc

Я унаследовал ужасный код синтаксического анализа MSXML (который, к сожалению, у меня нет времени переписывать). Этот код полон утечек COM-интерфейса / BSTR, где оригинальные авторы либо неправильно использовали ручной подсчет ссылок COM (который всегда, кажется, заканчивается слезами), либо где они использовали интеллектуальные указатели COM, но использовали их неправильно, так что утечки произошли.

Я исправил многие утечки в коде, но все еще обнаруживаю, что msxml3.dll не выгружается, когда я вызываю CoUninitialize () (что должно быть, если все интерфейсы пропали) и используется больше памяти чем я ожидаю после запуска этого кода.

Сейчас я достигаю предела того, что могу определить вручную, и ищу решение для отладки, которое может идентифицировать подобные утечки. В прошлом я использовал umdh с хорошим эффектом для обнаружения обычных утечек, но это не кажется очень полезным с утечками COM. Кто-нибудь может порекомендовать хороший подход?


person Benj    schedule 17.08.2012    source источник
comment
Вы пробовали прикрепить процесс к AppVerifier? Инструмент показывает трассировку стека для каждой утечки. (У вас должны быть правильные символы, чтобы увидеть трассировку стека)   -  person Mahesh    schedule 17.08.2012
comment
Подтверждающий приложение все еще делает это? Я уверен, что там использовались некоторые параметры COM, но я не вижу их в версии, которая у меня с SDK 7.0   -  person Benj    schedule 17.08.2012
comment
У меня версия 6.2, и я вижу, что Leaks участвует в Basic тестах.   -  person Mahesh    schedule 17.08.2012
comment
msdn.microsoft.com/en-us/ library / sycfy8ec% 28v = vs.80% 29.aspx может быть полезным, хотя я не думаю, что он решит все ваши проблемы.   -  person AlexLordThorsen    schedule 17.08.2012
comment
@Mahesh - Ах да, я пробовал это, похоже на umdh, похоже, утечки COM не обнаруживаются, только нормальные утечки. Программа отлично работает с включенным appverifier.   -  person Benj    schedule 17.08.2012
comment
@Rawrgulmuffins - Я пробовал это, но подозреваю, что это работает, только если AddRef / Release встречается в вашем объектном коде (поскольку это директива препроцессора), я не уверен, что это работает, когда они неявны (например, с умными указателями) .   -  person Benj    schedule 17.08.2012
comment
В этом есть смысл, я посмотрю, можно ли изменить интеллектуальные указатели для вызова std :: err при вызове конструктора и деструктора.   -  person AlexLordThorsen    schedule 17.08.2012


Ответы (1)


Попробуйте BoundsChecker (продукт Micro Focus). Если вы активируете функцию «Отслеживание COM-объекта», она покажет вам утечки COM-интерфейса. Он работает как с приложениями X86, так и с X64. Тем не менее, ваш опыт может отличаться: я работаю над очисткой этого кода прямо сейчас (что привело меня к вашему вопросу через Google), и наша следующая версия должна быть лучше. Этот конкретный код не меняли уже много лет.

Что касается утечек SysAlloc, это сложная область из-за того, как класс IMalloc кэширует освобожденную память, а не освобождает ее. Я все еще работаю в этой области, насколько позволяют время и перерывы.

Раскрытие информации (если это еще не очевидно): я работаю в Micro Focus, в частности, в BoundsChecker.

person Rick Papo    schedule 19.10.2012
comment
Интересно, что вы говорите об IMalloc, я наблюдаю такое поведение. - person Benj; 19.10.2012