Pull to refresh

Comments 12

Есть альтернативы valgrind’у, такие как strace

это не альтернатива, это просто другой инструмент
Да, но конкретно инструментов, которые могли бы заменить Valgrind, нет, поэтому довольствуемся тем, что есть.
«Я не знаю» != нет. Для утечек есть heaptrack.
Хм, мне кажется, что когда я пользовался Visual Leak Detector, то он нормально показывал места утечек.
А в целом по утечкам есть еще один неприятный момент. Некоторые программисты считают, что память для одиночных объектов, тех которые порождаются один раз в начале программы нет необходимости принудительно освобождать. Мол программа завершается и все, память будет сама собой освобождена. И вроде бы они правы.
Но когда смотришь на десятки-сотни неосвобожденных объектов и думаешь, а какие же из них это реальные утечки?
Причем ладно бы это был код написанный тобой и другими программистами команды. Но ведь подключаешь кучу сторонних библиотек со своим АПИ. Что там внутри происходит не до конца понятно. Вот вызвал простую init() а она выделила десять блоков и нет АПИ функции освободить.
Еще хуже, когда выделяется память ядра при вызове специфичного ioctl. Как потом найти утечку непонятно.

Как насчет LeakSanitizer? Трэйс выглядит как-то так (даже строчку показывает):


Spoiler header

image


Есть подвижки в портировании под Visual Studio (но пока только подвижки, ASan это немного другое)

Интересный инструмент. Надо будет попробовать на досуге. Спасибо огромное!

К тому же по моим наблюдениям ASAN/TSAN ощутимо быстрее, чем valgrind

При моей не любви к MacOS и XCode, там профилировщики ооочень удобные.
Никто, случайно, не знает аналог профилировщика аллокаций XCode под Windows?

Я понимаю, что здесь рассказывается про инструменты динамического анализа кода, но всё равно вставлю свои две копейки. Можно найти подобные простые ошибки альтернативно. С этим вполне справляется статический анализатор PVS-Studio. Правда, в первом случае он делает это косвенно:

V519 The 'students' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 82, 87. test.cpp 87

Во втором случае он явно скажет:

V773 The function was exited without releasing the 'mas' pointer. A memory leak is possible. test.cpp 29

Но для этого придётся изменить название функции main :). В функции main подобные утечки памяти сознательно не ищутся, так как это распространённая практика, завершить работу, не утруждая себя очисткой памяти в простых программа. Кто не понимает зачем, того отправляю к статье "Почему я не люблю синтетические тесты" :).

Конечно, статические анализаторы слабее динамических в плане выявления утечек памяти. Однако, они могут стать хорошей первой линией оборины. Подробнее эта тема раскрыта здесь "Да, PVS-Studio умеет выявлять утечки памяти".

И последнее. Не забывайте, что PVS-Studio можно использовать бесплатно в образовательных целях: "Преподавателям на заметку: PVS-Studio для знакомства студентов с инструментами анализа кода".

Хорошая статья, узнал несколько полезных возможностей по теме. Но нашел проблему - если выделять память в линуксе не через С, а через mmap.
Valgrind говорит все хорошо, от этого вопрос: а будет ли статья по его устройству, причем не в пользовательском стиле (типа "делает магию, используя магию"), а в реальном его устройстве? Раскрытия такой темы пока не нашел.

malloc в linux при запросе достаточно большого объема памяти (128 КБ по дефолту) как раз использует mmap. При этом используется анонимное отбражение памяти из адресного пространства самого процесса. Такая выделенная память при завершении процесса умрет вместе с ним. Описано в т.ч. тут: https://habr.com/ru/company/smart_soft/blog/185226/

Sign up to leave a comment.

Articles

Change theme settings