Как мне найти, где мое приложение .Net пропускает дескрипторы Windows?

У меня есть приложение WinForms .Net, которое работает с большим количеством документов XPS (тысячи), и во время этого запуска количество дескрипторов (в соответствии с монитором процессов sysinternals и диспетчером задач) увеличивается на 3-10 для каждого документа. Я сильно подозреваю, что это дескрипторы, которые открываются и не закрываются библиотеками платформы MS .Net XPS, но я не могу их отследить.

Несмотря на пошаговое выполнение кода, количество дескрипторов увеличивается в разные моменты во время одного и того же запуска. Например, один проход через цикл и количество дескрипторов подскочит на 1 в одной строке, а в следующий раз может не измениться или может подскочить на 2. Поэтому я подозреваю, что компоненты XPS com имеют утечку дескрипторов.

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

До сих пор я пробовал sysinternals process explorer смотреть на дескрипторы, но все они помечены как без подробностей. Также используется handle.exe от sysinternals, и это не показывает существенной разницы между моментальным снимком до, во время и после.

Любые подсказки о том, как отследить, куда идут ручки? Я думаю, что мне придется упростить тестирование до однопоточного консольного приложения.

С уважением

Райан


person Ryan O'Neill    schedule 23.10.2008    source источник


Ответы (4)


Хотя это немного дорого для индивидуального использования, мы используем ANTS Profiler и это очень полезно в поиске таких проблем. Вы можете скачать и попробовать пробную версию.

Вероятно, есть и другие хорошие профилировщики, но это тот, с которым я знаком.

person Paige Watson    schedule 23.10.2008
comment
Я использовал это, но я думаю, что он покажет только дескрипторы .Net, где они просачиваются на более низком уровне из фреймворка, который я подозреваю (в данном случае во многом это COM). - person Ryan O'Neill; 24.10.2008
comment
Насколько я знаю, профилировщик .Net не может обнаруживать утечки неуправляемых дескрипторов. Но мне удается сузить круг вручную. Как ни странно, виноват был не COM, а Image.FromStream (.net v1.1) - person faulty; 24.10.2008

Возможно глупо, но проверяли ли вы, что выбрасываете все одноразовое?

person Jon Skeet    schedule 23.10.2008
comment
Да, как я уже сказал, использование памяти сейчас в порядке (было много проблем с утечкой в ​​вызове COM XPS), поэтому я думаю, что проблема не в утилизации. Я сильно подозреваю, что дело в XPS, но пока не могу этого доказать. - person Ryan O'Neill; 24.10.2008
comment
Dispose на самом деле не имеет отношения к памяти — это больше связано с освобождением неуправляемых ресурсов (дескрипторов). Я не говорю, что это это, но это стоит проверить. - person Jon Skeet; 24.10.2008
comment
+1 — используйте FxCop, чтобы помочь обнаружить места, где вы не можете избавиться. - person Joe; 24.10.2008

Итак, вы забыли удалить созданные вами XPS-документы из PackageStore? А как насчет любых потоков памяти, используемых для резервного копирования ваших пакетов?

person Community    schedule 30.03.2009
comment
Нет, это было просто открытие и повторение документа XPS. Я не создавал никаких объектов. Я отследил это до операции XPS и нашел обходной путь (как подробно описано в другом моем вопросе). - person Ryan O'Neill; 31.03.2009

У меня есть хороший опыт диагностики именно такого рода ошибок с помощью профилировщика YourKit .net. Настоятельно рекомендуется — он относительно дешев и даже достаточно хорошо справляется с C++-CLI (я пробовал другие, такие как dottrace от jetbrains, которые либо отказались, либо просто разбились).

person Jon Cage    schedule 18.06.2012