Как отладить невыпущенные ссылки COM из управляемого кода? - PullRequest
3 голосов
/ 08 марта 2010

Я искал инструмент для отладки невыпущенных ссылок COM, которые обычно вызывают, например, Процессы Word / Outlook зависают в памяти, если код неправильно вызывает Marshal.ReleaseCOMObject на всех экземплярах COM. (Outlook 2007 частично исправляет это для надстроек Outlook, но это общий вопрос).

Существует ли инструмент, который отображал бы хотя бы список ссылок COM (по типу), содержащихся в управляемом коде? В идеале он также отображал бы деревья объектов в стиле профилировщика памяти, помогая отлаживать там, где ссылка произошло увеличение.

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

Если такого инструмента не существует, в чем (техническая причина) причина? Это было бы очень полезно для отладки многих других проблем, которые трудно найти при работе с COM-взаимодействием.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2010

Вот мой ответ на отладку COM-ссылок с использованием отладчика

Устранение неполадок, связанных с тупиком приложения COM +

0 голосов
/ 09 марта 2010

Не совсем тот ответ (или такой простой), который вы ищете, но ReleaseCOMObject (как и нативный выпуск, который он упаковывает) возвращает Integer, который должен указывать количество оставшихся ссылок. Вы можете добавить код в свой проект для явного выполнения AddRef, чтобы затем можно было выполнить Release, посмотреть новый счетчик и посмотреть, соответствует ли он ожидаемому и т. Д.

...