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