Детекторы утечки памяти для C?

С какими детекторами утечки памяти у людей был хороший опыт?

Вот краткое изложение ответов на данный момент:

Valgrind - Платформа инструментов для создания инструментов динамического анализа.

Electric Fence - инструмент, который работает с GDB

Шина - облегченная статическая проверка с помощью аннотаций

Glow Code - это полный профилировщик производительности и памяти в режиме реального времени для программистов Windows и.NET, которые разрабатывают приложения на C++, C# или любом.NET Framework

Также см. Этот пост stackru.

17 ответов

Решение

Второй валгринд... и я добавлю электрический забор.

Valgrind под Linux довольно хорош; У меня нет опыта под Windows с этим.

Если у вас есть деньги: IBM Rational Purify - это чрезвычайно мощный промышленный детектор утечки памяти и повреждения памяти для C/C++. Существует для Windows, Solaris и Linux. Если вы только для Linux и хотите дешевое решение, выберите Valgrind.

Грязевик для GCC! Это на самом деле компилирует проверки в исполняемый файл. Просто добавь

-fmudflap -lmudflap

на ваши флаги gcc.

У меня было довольно много хитов с cppcheck, который выполняет только статический анализ. Это с открытым исходным кодом и имеет интерфейс командной строки (я не использовал его по-другому).

Больно, но если вам пришлось использовать один..
Я бы порекомендовал пакет DevPartner BoundsChecker... это то, что люди на моем рабочем месте используют для этой цели. Заплатил фирму.. не бесплатную.

Также стоит использовать, если вы используете Linux, используя glibc - встроенный код кучи отладки. Чтобы его использовать, свяжите его с -lmcheck или определите (и экспортируйте) переменную среды MALLOC_CHECK_ со значением 1, 2 или 3. В руководстве glibc содержится дополнительная информация.

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

lint (очень похожий инструмент с открытым исходным кодом под названием splint)

В Windows я использовал Visual Leak Detector. Интегрируется с VC++, прост в использовании (просто включите заголовок и установите LIB для поиска библиотеки), с открытым исходным кодом, бесплатное использование FTW.

Для отладки утечек памяти в Win32 у меня был очень хороший опыт работы с простой старой CRT Debug Heap, которая поставляется вместе с Visual C.

В сборке Debug malloc (et al) переопределяется как _malloc_dbg (et al), и существуют другие вызовы для получения результатов, которые все не определены, если _DEBUG не установлен. Он устанавливает всевозможные пограничники в куче и позволяет отображать результаты в любое время.

У меня было несколько ложных срабатываний, когда я был свидетелем некоторых временных процедур, которые путались с распределением времени выполнения библиотеки, пока я не обнаружил _CRT_BLOCK.

Мне пришлось создать сначала DOS, затем консоль Win32 и сервисы, которые будут работать вечно. Насколько я знаю, утечек памяти нет, и, по крайней мере, в одном месте код запускается в течение двух лет без присмотра, прежде чем выходит из строя монитор на ПК (хотя с ПК все было в порядке!).

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

GlowCode

Куча отладки

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

Это мой собственный проект - я поставил его как открытый исходный код:

https://sourceforge.net/projects/diagnostic/

Поддерживаются 32- и 64-разрядные платформы Windows, поддерживаются стеки вызова в собственном и смешанном режимах.

Сборка мусора.NET не поддерживается. (C++ Cli's gcnew или C# новый)

Это высокопроизводительный инструмент и не требует какой-либо интеграции (если только вы действительно не хотите его интегрировать).

Полное руководство можно найти здесь:

http://diagnostic.sourceforge.net/index.html

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

В университете, когда я делал большинство вещей под Unix Solaris, я использовал gdb.

Однако я бы пошел с valgrind под Linux.

Дедушка этих инструментов - коммерческий инструмент Purify с закрытым исходным кодом, который был продан IBM, а затем UNICOM.

Insure ++ от Parasoft (инструментарий исходного кода) и valgrind (с открытым исходным кодом) являются двумя другими настоящими конкурентами.

Викторины: первоначальный автор Purify, Рид Гастингс, продолжал основывать NetFlix.

Никто не упомянул MSan Clang, который является довольно мощным. Хотя официально он поддерживается только в Linux.

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

Зачем использовать уже написанный код, когда вы можете написать свой собственный:)

Я шучу, но иногда нужно что-то простое, и это быстрее написать самому. Обычно я просто заменяю вызовы malloc() и free() функциями, которые лучше отслеживают, кто что выделяет. Кажется, большинство моих проблем забыто освободить, и это помогает решить эту проблему.

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

Наш инструмент CheckPointer может сделать это для GNU C 3/4 и MS, диалектов C и GreenHills C. Он может найти проблемы с управлением памятью, которые Valgrind не может.

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

Другие вопросы по тегам