COM C # Отслеживание утечки памяти - PullRequest
2 голосов
/ 06 февраля 2009

Есть ли способ узнать использование памяти каждой dll в приложении c #, используя com dll? Или, что бы вы сказали, это лучший способ выяснить, почему объем памяти растет экспоненциально при использовании com-объекта (т. Е. Имеет ли утечка памяти у COM-объекта или должно произойти какое-то специальное освобождение объектов, передаваемых в управляемый код (и / или как это сделать)).

Ответы [ 4 ]

2 голосов
/ 06 февраля 2009

Выпускаете ли вы COM-объект после использования (Marshal.ReleaseComObject)?

Какой тип параметров вы передаете в / из вызовов?

Если у вас нет исходного кода COM-объекта и вы хотите определить причину его «утечки», запустите COM-объект outa proc, подключите WinDBG к процессу и установите точки останова в API-интерфейсах выделения памяти (HeapAlloc и т. ). Посмотрите на стек вызовов и шаблоны распределения. Конечно, вы можете использовать профилировщики на управляемой стороне, но если вы хотите знать, что происходит, вам придется испачкать руки ...

1 голос
/ 06 февраля 2009

У инженера службы поддержки Microsoft есть великолепный блог, в котором рассказывается о многих случаях, таких как this . Она просматривает все инструменты, которые она использует. Мне было очень полезно прочитать все ее посты, когда я отлаживал подобные вещи несколько лет назад.

Редактировать: По-видимому, она добавила серию лабораторных работ, которые объясняют, как настроить вашу среду и диагностировать различные проблемы. Вы можете начать здесь .

0 голосов
/ 06 февраля 2009

Первое, что я хотел бы сделать, это быть абсолютно уверенным, что я нигде не пропускаю ссылки, а затем перейти к самым маленьким шагам, которые будут воспроизводить шаги (хороший профилировщик необходим, я случайно использую и рекомендую RedGate ANTS Profiler ) - это можно сделать, и стоит отправить пример кода, который воспроизводит проблему поставщику COM-объекта, чтобы они могли ее решить (в результате есть исправление для Crystal Reports утечки памяти в ней я обнаружил:)

0 голосов
/ 06 февраля 2009

скалы dotTrace: http://www.jetbrains.com/profiler/

Имейте в виду, что все COM-объекты в .NET в основном являются классами, производными от MarshalByRefObject, поэтому вы должны иметь возможность искать потребление памяти такими объектами как один потенциальный фильтр.

...