Профилировщик VS2010 / обнаружение утечек

Кто-нибудь знает профилировщик и детектор утечки, который будет работать с кодом VS2010? Желательно тот, который работает на Win7.

Я искал здесь и в Google. Я нашел один детектор утечки, который работает (Memory Validator), но я не слишком впечатлен. Во-первых, он показывает множество утечек в меню и вещи, которые, я уверен, не являются реальными. Я также попробовал GlowCode, но он ПРОСТО профилировщик и отказывается устанавливать на win7.

Я использовал AQtime. В нем было все, что мне было нужно, обнаружение утечек памяти / ресурсов, профилирование различных вещей, статический анализ и т. Д. К сожалению, сейчас это дает ложные результаты.

Моя главная проблема заключается в том, что VS2010 говорит, что в программе есть утечки, которых не было в VS2005. Я почти уверен, что это ложные срабатывания, но я не могу найти хороший инструмент для проверки этого. Memory Validator не показывает те же самые, и сообщение об утечках от VS не кажется рациональным.

6 ответов

Для обнаружения утечек памяти вы можете попробовать инструмент Visual Leak Detection.

Ноа, как упоминал Ори, DevPartner Studio от Micro Focus имеет функции обнаружения утечек и другие функции профилирования во время выполнения. В отличие от высоких цен, которые DPS имел под Compuware, теперь вы можете лицензировать только профилировщики времени выполнения, а не весь пакет, если это то, что вам нужно. Бесстыдная вилка: я работаю в команде DevPartner. Наша поддержка 64-разрядных приложений будет выпущена в версии 10.5 4 февраля 2011 года. Информацию о новостях и загрузках по электронной почте можно найти на http://www.devpartner.com/.

Лично мне нравится DevPartner. Если вы работаете в большой компании, возможно, вы сможете убедить их заплатить за здоровенную лицензию. Это дорого, но очень крепко.

Здесь действительно очень простой и удобный код обнаружения утечек: http://www.codeproject.com/kb/cpp/MemLeakDetect.aspx

Не уверен, как сделать ссылку на это, которое я ранее разместил в ответ на аналогичный вопрос:

Вы можете использовать umdh.exe для захвата и сравнения снимков процесса до и после утечки. Это лучше всего работает с двоичными файлами отладки, но является жизнеспособным с выпуском при условии, что пути символов заданы правильно - это даст вам стеки памяти, выделенные между первым и вторым снимками.

http://support.microsoft.com/kb/268343

Этот подход имеет то преимущество, что он бесплатный.

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

  • Рациональное Количество: фантастический продукт для профилирования производительности, но они не выпускали новые версии в течение нескольких лет, и часто (в моем случае) программное обеспечение часто отказывалось работать
  • AQTime: также очень хорошо (меньше, чем Rational Quantity), но иногда отказывается работать по неизвестным причинам.
  • Валидатор производительности: тот же

В последние годы я вернулся к довольно грубому способу отбора заявок. Это не так идеально, как использование инструментов, но гораздо быстрее, может быть запущено в любом приложении и всегда работает. Мой фаворит - "Очень Сонный" ( http://www.codersnotes.com/sleepy), но также неплохой Люк StackWalker ( http://lukestackwalker.sourceforge.net/). Поскольку приложения могут запускаться немедленно и без заметного замедления, цикл "изменить приложение, профиль" очень короткий и эффективный.

Для поиска утечек памяти в Windows есть несколько инструментов, которые вы можете использовать. Опять же, они далеки от совершенства и часто могут исследовать только запущенные приложения извне, а не просто сообщать об утечках в конце приложения. Найдите "Инструменты отладки Microsoft" (UMDH, LeakDiag, gflags). Лично мне гораздо проще написать свой собственный менеджер памяти и позволить ему сообщать об утечках в конце приложения. Это не так сложно написать. Что вам нужно сделать, это:

  • Реализуйте правильные новые и удалите операторы (я думаю, вы должны реализовать 4 новых и 4 удалить операторы)
  • При реализации new получите стек вызовов (ищите StackWalk) и сохраните его с выделенной памятью.
  • Создайте класс, который запускает ваш менеджер памяти в конструкторе, и сообщите обо всех утечках (включая стек вызовов) в деструкторе.
  • Создайте глобальную переменную этого класса. Может потребоваться сделать его специальной глобальной переменной, используя #pragma (init_seg).
Другие вопросы по тегам