С какими детекторами утечки памяти у людей был хороший опыт?
Вот краткое изложение полученных ответов:
Валгринд - Инструментальная среда для построения инструментов динамического анализа.
Забор под напряжением - инструмент, который работает с GDB
Шина - облегченная статическая проверка с помощью аннотаций
Код свечения - это полный профилировщик производительности и памяти в реальном времени для программистов Windows и .NET, которые разрабатывают приложения на C++, C# или любой .NET Framework.
Также см. Этот сообщение stackoverflow.





Валгринд под linux неплохо работает; У меня нет опыта работы с этим под Windows.
У меня минимальная любовь к детекторам утечки памяти. Обычно ложных срабатываний слишком много, чтобы они могли быть полезны. Я бы рекомендовал эти два как наименее навязчивые:
lint (очень похожий инструмент с открытым исходным кодом под названием шина)
Тем более, что шина - это не столько про утечки.
во-вторых, Valgrind ... и я добавлю забор под напряжением.
Электрический забор не предназначен для обнаружения утечек памяти.
Больно, но если бы пришлось использовать один ...
Я бы порекомендовал пакет DevPartner BoundsChecker .. это то, что люди на моем рабочем месте используют для этой цели. Платные проприетарные .. не бесплатные.
Я сам использовал BoundsChecker. невероятно был полезен как при утечках памяти, так и при других утечках ресурсов.
Я буду использовать valgrind в качестве внешнего инструмента для устранения утечек памяти. Но для большинства проблем, которые мне приходилось решать, я всегда использовал внутренние инструменты. Иногда внешние инструменты имеют слишком много накладных расходов или слишком сложны для настройки.
Зачем использовать уже написанный код, если можно написать свой собственный :)
Шучу, но иногда нужно что-то простое и быстрее самому написать. Обычно я просто заменяю вызовы malloc () и free () функциями, которые лучше работают. отслеживать, кто что выделяет. Кажется, что большинство моих проблем кто-то забыл освободить, и это помогает решить эту проблему.
Это действительно зависит от того, где находится утечка, и если бы вы знали об этом, вам не понадобились бы никакие инструменты. Но если у вас есть некоторое представление о том, где, по вашему мнению, происходит утечка, тогда установите свои собственные инструменты и посмотрите, поможет ли это вам.
Для отладки утечек памяти Win32 у меня был очень хороший опыт работы с простой старой кучей отладки CRT, которая поставляется в виде библиотеки с Visual C.
В отладочной сборке malloc (и др.) Переопределяется как _malloc_dbg (и др.), И есть другие вызовы для получения результатов, которые все не определены, если _DEBUG не установлен. Он устанавливает всевозможные пограничники в куче и позволяет отображать результаты в любое время.
У меня было несколько ложных срабатываний, когда я наблюдал за некоторыми подпрограммами времени, которые мешали распределению времени выполнения библиотеки, пока я не обнаружил _CRT_BLOCK.
Мне пришлось создать сначала DOS, затем консоль Win32 и службы, которые работали бы вечно. Насколько я знаю, утечек памяти нет, и, по крайней мере, в одном месте код работал в течение двух лет без присмотра, прежде чем монитор на ПК вышел из строя (хотя ПК был в порядке!).
Дедушкой этих инструментов является коммерческий инструмент Очистить с закрытым исходным кодом, который был продан IBM, а затем UNICOM.
Страхование ++ от Parasoft (инструментарий исходного кода) и valgrind (открытый исходный код) - два других реальных конкурента.
Интересный факт: оригинальный автор Purify, Рид Гастингс, основал NetFlix.
Если у вас есть деньги: IBM Rational Purify - чрезвычайно мощный в отрасли детектор утечек и повреждений памяти для C / C++. Существует для Windows, Solaris и Linux. Если вы работаете только с Linux и хотите дешевое решение, выбирайте Valgrind.
Что Purify делает, а Valgrind - нет? В прошлый раз, когда я пробовал Purify, было очень сложно настроить и извлечь что-нибудь из этого, к тому же вам пришлось скомпилировать с помощью их компилятора. Valgrind использует вашу обычную отладочную сборку.
Обратите внимание, что очистка была продана UNICOM Systems unicomsi.com/products/purifyplus
Брызговик для gcc! Фактически он компилирует проверки в исполняемый файл. Просто добавь
-fmudflap -lmudflap
к вашим флагам gcc.
Для будущих пользователей это уже не так. По ссылке флаги ничего не делают. Вместо этого используйте Address Sanitizer.
В Windows я использовал Визуальный детектор утечки. Интегрируется с VC++, прост в использовании (просто включите заголовок и установите LIB, чтобы найти библиотеку), с открытым исходным кодом, бесплатно использовать FTW.
Также стоит использовать, если вы работаете в Linux, используя glibc, - это встроенный код отладочной кучи. Чтобы использовать его, установите связь с -lmcheck или определите (и экспортируйте) переменную среды MALLOC_CHECK_ со значением 1, 2 или 3. В руководстве по glibc содержится дополнительная информация.
Этот режим наиболее полезен для обнаружения двойного освобождения, и он часто находит записи за пределами выделенной области памяти при выполнении освобождения. Я не думаю, что это сообщает об утечке памяти.
Наш инструмент CheckPointer может сделать это для GNU C 3/4 и, диалектов MS языка C и GreenHills C. Он может обнаруживать проблемы с управлением памятью, которые Valgrind не может.
Если ваш код просто просочится, при выходе CheckPointer сообщит вам, где была выделена вся неиспользованная память.
У меня было довольно много совпадений с cppcheck, который выполняет только статический анализ. Он с открытым исходным кодом и имеет интерфейс командной строки (по-другому я его не использовал).
+1 для cppcheck - тот не использовал, так что гляну; важная рекомендация - статический анализ
Никто не упомянул MSan из clang, который довольно мощный. Однако официально он поддерживается только в Linux.
Этот вопрос может быть старый, но я все равно на него отвечу - может быть, мой ответ кому-то поможет найти утечки памяти.
Это мой собственный проект - я поставил его как открытый исходный код:
https://sourceforge.net/projects/diagnostic/
Поддерживаются 32- и 64-разрядные платформы Windows, поддерживаются стеки вызовов в собственном и смешанном режимах.
Сборка мусора .NET не поддерживается. (C++ cli's gcnew или новый C#)
Это высокопроизводительный инструмент, не требующий какой-либо интеграции (если вы действительно не хотите его интегрировать).
Полное руководство можно найти здесь:
http://diagnostic.sourceforge.net/index.html
Не бойтесь того, сколько на самом деле он обнаружит утечки в вашем процессе. Он ловит утечки памяти из всего процесса. Анализируйте только самые большие утечки, а не все.
См. Также: github.com/google/sanitizers