Детекторы утечки памяти для 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 и сервисы, которые будут работать вечно. Насколько я знаю, утечек памяти нет, и, по крайней мере, в одном месте код запускается в течение двух лет без присмотра, прежде чем выходит из строя монитор на ПК (хотя с ПК все было в порядке!).
У меня была минимальная любовь к любым детекторам утечки памяти. Как правило, существует слишком много ложных срабатываний, чтобы их можно было использовать. Я бы порекомендовал эти два как наименее навязчивый:
Этот вопрос может быть старый, но я все равно отвечу на него - возможно, мой ответ поможет кому-то обнаружить утечки памяти.
Это мой собственный проект - я поставил его как открытый исходный код:
https://sourceforge.net/projects/diagnostic/
Поддерживаются 32- и 64-разрядные платформы Windows, поддерживаются стеки вызова в собственном и смешанном режимах.
Сборка мусора.NET не поддерживается. (C++ Cli's gcnew или C# новый)
Это высокопроизводительный инструмент и не требует какой-либо интеграции (если только вы действительно не хотите его интегрировать).
Полное руководство можно найти здесь:
http://diagnostic.sourceforge.net/index.html
Не бойтесь того, насколько сильно он обнаруживает утечки вашего процесса. Он улавливает утечки памяти из всего процесса. Анализируйте только самые большие утечки, а не все.
Дедушка этих инструментов - коммерческий инструмент 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 сообщит вам, где была выделена вся неиспользованная память.