Методы обнаружения / предотвращения неуправляемых утечек в управляемом коде - PullRequest
0 голосов
/ 08 января 2010

Каков наилучший способ для разработчика .NET выследить (и избежать) неуправляемых утечек в управляемом приложении?

Кажется, есть много отличных ресурсов для отслеживания управляемых утечек, но я не нашел много информации по отслеживанию неуправляемых утечек в управляемом приложении.

Этот вопрос связан, но задает вопрос с чисто неуправляемой точки зрения, поэтому многие ответы предполагают, что у вас есть доступ к неуправляемому коду, и ни в одном из них не упоминаются какие-либо подводные камни, связанные с .NET или техники.

Вот некоторые (очень простые) вещи, которые я пробовал:

  • DebugDiag . Это выглядит очень многообещающе, и это может сработать для вас, но это может привести к сбою моего конкретного приложения.
  • Rational PurifyPlus . К сожалению, также вылетает мое приложение.
  • AQTime (по рекомендации @Reed и @Caelum). Эта программа выглядит потрясающе, но, как упоминал автор вопроса @Caelum, AQTime также вылетает из моего приложения.
  • Временно удалить код, который создает объекты, которые, я знаю, используют неуправляемую память.
  • Убедитесь, что приложение удаляет все объекты, которые реализуют IDisposable

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

Ответы [ 2 ]

0 голосов
/ 08 января 2010

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

0 голосов
/ 08 января 2010

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

Как вы сказали, обеспечение эффективного использования IDisposable и размышления о финализаторах и их влиянии на ваше приложение - это наилучшие способы, которые я нашел, чтобы избежать утечек:).

DebugDiag - это то, что команда производительности Microsoft будет использовать при поиске проблем с вашим приложением, и я считаю, что получение дампов памяти для него может быть даже интегрировано в диспетчер задач в Win 7 и Visual Studio 2010.

При использовании DebugDiag обязательно посмотрите на расширения SOS. Возможно, лучшим вопросом было бы спросить, почему DebugDiag и PurifyPlus терпят крах для вашего конкретного приложения? Поскольку это кажется, что это вызовет проблемы, независимо от того, что вы пытаетесь ...

...