Ответ 1
второй valgrind... и я добавлю электрический забор.
Какие детекторы утечки памяти имеют людей с хорошим опытом?
Вот краткое изложение ответов:
Valgrind - Инструментальная среда для создания инструментов динамического анализа.
Электрический забор - инструмент, который работает с GDB
Splint - облегченная статическая проверка с помощью аннотаций
Glow Code - это полноценный профайлер производительности и памяти в реальном времени для разработчиков Windows и .NET, которые разрабатывают приложения с С++, С#, или любой .NET Framework
Также см. этот qaru.site/info/49455/....
второй valgrind... и я добавлю электрический забор.
Valgrind под Linux довольно неплохо; У меня нет опыта работы с Windows.
Если у вас есть деньги: IBM Rational Purify - это чрезвычайно мощный прорыв памяти в промышленности и детектор повреждения памяти для C/С++. Существует для Windows, Solaris и Linux. Если вы используете только Linux и хотите дешевое решение, идите к Valgrind.
Mudflap для gcc! Он фактически компилирует проверки в исполняемый файл. Просто добавьте
-fmudflap -lmudflap
для ваших gcc-флагов.
lint (очень похожий инструмент с открытым исходным кодом под названием splint)
Болезненный, но если вам нужно было использовать его.
Я бы рекомендовал DevPartner BoundsChecker, чтобы то, что люди на моем рабочем месте используют для этой цели. Платные n запатентованные.. не бесплатные.
Также стоит использовать, если вы используете Linux, используя glibc, это встроенный код кучи отладки. Чтобы использовать его, ссылку на -lmcheck или определить (и экспортировать) переменную среды MALLOC_CHECK _ со значениями 1, 2 или 3. Руководство glibc содержит дополнительную информацию.
Этот режим наиболее полезен для обнаружения двойных разрядов, и он часто находит записи за пределами выделенной области памяти при выполнении свободного. Я не думаю, что он сообщает о утечке памяти.
У меня было довольно несколько хитов с cppcheck, что делает только статический анализ. Он имеет открытый исходный код и имеет интерфейс командной строки (я не использовал его каким-либо другим способом).
У меня была минимальная любовь к любым детекторам утечки памяти. Как правило, для них слишком много ложных срабатываний. Я бы рекомендовал эти два, как наименее навязчивые:
Для Win32 отладки утечек памяти у меня были очень хорошие впечатления от простой старой CRT Debug Heap, которая поставляется как lib с Visual C.
В сборке Debug malloc (и др.) получают переопределение как _malloc_dbg (и др.), и есть другие вызовы для получения результатов, которые все undefined, если _DEBUG не установлен. Он устанавливает всевозможные пограничные ограждения в куче и позволяет вам выполнять результаты в любое время.
У меня было несколько ложных срабатываний, когда я занимался некоторыми процедурами времени, которые возились с распределением времени выполнения библиотеки, пока я не обнаружил _CRT_BLOCK.
Мне пришлось создать первую DOS, а затем консоль Win32 и службы, которые будут работать навсегда. Насколько я знаю, утечек памяти нет, и по крайней мере в одном месте код запускается два года без присмотра перед тем, как монитор на ПК потерпел неудачу (хотя ПК был в порядке!).
В Windows я использовал Visual Leak Detector. Интегрируется с VС++, прост в использовании (просто включите заголовок и установите LIB для поиска lib), с открытым исходным кодом, свободно использовать FTW.
В университете, когда я делал большинство вещей в Unix Solaris, я использовал gdb.
Однако я бы пошел с valgrind под Linux.
Дедушкой этих инструментов является коммерческий инструмент Purify, который был продан IBM, а затем UNICOM
Parasoft Insure ++ (исходный код инструментария) и valgrind (с открытым исходным кодом) являются двумя другими реальными конкурентами.
Общая информация: оригинальный автор Purify, Рид Хастингс, продолжил поиск NetFlix.
Никто не упоминал clang MSan, который довольно мощный. Однако он официально поддерживается только для Linux.
Этот вопрос может быть старым, но я все равно отвечу - возможно, мой ответ поможет кому-то найти утечку памяти.
Это мой собственный проект - я назвал его открытым исходным кодом:
https://sourceforge.net/projects/diagnostic/
Поддерживаются поддерживаемые 32-разрядные и 64-разрядные платформы Windows, поддерживаются стандартные и групповые вызовы.
Сбор мусора .NET не поддерживается. (С++ cli gcnew или С# new)
Это высокопроизводительный инструмент и не требует интеграции (если вы действительно не хотите его интегрировать).
Полное руководство можно найти здесь:
http://diagnostic.sourceforge.net/index.html
Не бойтесь того, насколько он действительно обнаруживает утечки этого процесса. Он захватывает утечки памяти из всего процесса. Проанализируйте только самые большие утечки, не все.
Я заставлю valgrind в качестве внешнего инструмента для утечек памяти.
Но для большинства проблем, которые мне приходилось решать, я всегда использовал встроенные инструменты. Иногда внешние инструменты имеют слишком много накладных расходов или слишком сложны для настройки.
Зачем использовать уже написанный код, когда вы можете написать свой собственный:)
Я шучу, но иногда вам нужно что-то простое и быстрее писать сами. Обычно я просто заменяю вызовы на malloc() и free() с функциями, которые сохраняются лучше отслеживать, кто что выделяет. Большинство моих проблем, кажется, кто-то забыл бесплатно, и это помогает решить эту проблему.
На самом деле это зависит от того, где протекает утечка, и если бы вы это знали, тогда вам не нужны никакие инструменты. Но если у вас есть представление о том, где вы думаете, что оно протекает, тогда поставьте свое собственное инструментальное средство и посмотрите, поможет ли оно вам.
Наш инструмент CheckPointer может сделать это для GNU C 3/4 и диалектов MS на C и GreenHills C. Он может найти управление памятью проблемы, которые Вальгринд не может.
Если ваш код просто протекает, при выходе CheckPointer сообщит вам, где была выделена вся свободная память.