Как я могу найти, где мое приложение .Net пропускает дескрипторы Windows? - PullRequest
4 голосов
/ 24 октября 2008

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

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

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

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

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

Привет

Ryan

Ответы [ 4 ]

1 голос
/ 24 октября 2008

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

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

1 голос
/ 24 октября 2008

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

0 голосов
/ 18 июня 2012

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

0 голосов
/ 31 марта 2009

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

...