Valgrind |
Автор: admin Просмотров: 4309 Комментарии:
Добавлен: 9 апреля 2016
Обновлено: 11.04.2016 - 22:42
Инструмент программирования для отладки памяти, обнаружения утечек памяти и профилирования. Valgrind изначально разработан как отладчик памяти для GNU/Linux на x86, но с тех пор превратился в общий фреймворк для создания динамических инструментов анализа, таких как чекеры и профайлеры.
Valgrind по сути является виртуальной машиной, использующей JIT-компилирование и динамическое перекомпилирование. Ни что из оригинальной программы никогда не выполняется непосредственно на основном процессоре. Вместо этого, Valrign сначала переводит программу в более простую временную форму, называемую промежуточным представлением (Intermediate Representation (IR)) в независимой от процессора SSA форме. После конвертирования, инструмент свободен делать любые преобразования на IR, до того как Valgrind переведёт IR обратно в машинный код и позволит основному процессору запустить его. Это используют даже не смотря на то что может использоваться динамический перевод, то есть когда основной и целевой процессор принадлежат разным архитектурам. Valgrind перекомпилирует двоичный код для запуска на основном и целевом CPU (или его симулировании) на той же архитектуре. Сюда также входят GDB заглушки, чтобы разрешить отладку целевой программы во время работы в Valgrind при помощи команды мониторинга "monitor commands", позволяющей запрашивать различную информацию у Valgrind.
На этих преобразованиях значительно теряется производительность (и как правило, код вставки инструмента). Как правило, код работающий с Valgrind и с ничего не делающим инструментом (который ничего не делает на IR) работает c 1/4 до 1/5 от скорости обычной программы.
Инструменты Valgrind
Memcheck
Есть несколько инструментов включенных в Valgrind и несколько внешних. Инструментом по умолчанию и наиболее часто используемым является Memcheck. Memcheck вставляет дополнительный инструментальный код вокруг почти всех инструкций, который отслеживает правильность (все нераспределенные памяти начинается как недействительные или "не определенные", пока он не будет инициализирован в детерминированном состоянии, возможно, из другой памяти) и адресация (будь то адрес памяти вопрос указывает на размещенную без освобожденного блока памяти), хранятся в так называемых V битах и A битах соответственно. Поскольку данные перемещаются и манипулируются, инструментальный код отслеживает биты A и V, чтобы они всегда были правильными на уровне простых битов (single-bit level).
Кроме этого, Memcheck заменяет стандартный C аллокатор памяти своей реализацией, которая также включает в себя охрану памяти вокруг всех выделенных блоков (с набором битов A помеченных как некорректные). Эта возможность позволяет Memcheck находить ошибки несоответствий (off-by-one), когда программа считывает или записывает вне выделенного блока на небольшие значения.
Memcheck может обнаружить и предупредить о проблемах:
- Использование неинициализированной памяти.
- Чтение и запись памяти после её освобождения.
- Чтение и запись с границы выделенного блока.
- Утечки памяти.
Ценой всего этого является потеря производительности. Программы, которые работают под Memcheck, обычно теряют производительность от 20 до 30 раз, а также используют больший объём памяти. Поэтому не все разработчики часто запускают свой код под MemCheck или любом другом инструменте Valgrind. Эти инструменты часто используются чтобы отследить специфические ошибки или найти скрытые ошибки, которые может найти Memcheck.
Другие инструменты Valgrind
- None запускает код в виртуальной машине без выполнения каких-либо анализов и таким образом, имеет наименьшее возможное потребление процессора и памяти на всех инструментах. Поскольку сам Valgrind предоставляет обратный след из за ошибки сегментации, инструмент none обеспечивает эту трассировку при минимальных затратах.
- Addrcheck, похожий на MemCheck, но с гораздо меньшим потреблением CPU и памяти, но и ловит меньше типов ошибок. Addrcheck был удален в версии 3.2.0.
- Massif - профайлер кучи. Отдельный GUI отображает вывод из Massif.
- Helgrind и DRD находят состояния гонок в многопоточном коде.
- Cachegrind - профайлер кэша. Отдельный GUI KCacheGrind отображает вывод из Cachegrind.
- Callgrind - анализатор callgraph, добавленный в версии 3.2.0. KCacheGrind как и Cachegrind отображает вывод из Callgrind.
- exp-sgcheck (именуемый EXP-ptrcheck до версии 3.7), экспериментальный инструмент для поиска стека и глобального массива ошибок переполнения, которые Memcheck не может найти. Некоторый код получается в ложных срабатываниях этого инструмента.
- EXP-dhat - инструмент динамического анализа кучи, который анализирует сколько памяти выделяется и как долго, а также моделирует использования памяти.
- EXP-BBV - симулятор производительности, который экстраполирует производительность из небольшого набора образцов.
Есть также несколько внешних инструментов. Одним из таких инструментов является ThreadSanitizer, другой детектор состояния гонки.
Поддерживаемые платформы Valgrind
Начиная с версии 3.4.0, Valgrind поддерживает GNU/Linux на x86, x86-64 и PowerPC. Поддержка OS X была добавлена в версии 3.5.0. Поддержка Linux на ARMv7 (используется в некоторых смартфонах) была добавлена в версии 3.6.0. Поддержка Solaris была добавлена в версии 3.11.0. Есть неофициальные порты на другие UNIX-подобныt платформs (FreeBSD, OpenBSD и NetBSD). Начиная с версии 3.7.0 добавлена поддержка платформы ARM / Android.
Начиная с версии 3.9.0 добавлена поддержка GNU/Linux на MIPS64 little и big endian для MIPS DSP ASE на MIPS32, для s390x десятичных инструкций с плавающей точкой, для POWER8 (Power ISA 2.07) инструкций, для Intel AVX2 инструкций, для Intel Transactional Synchronization Extensions, RTM и HLE и начальная поддержка аппаратного обеспечения транзакционной памяти на POWER.
История и развитие Valgrind
Valgrind назван в честь главного входа в Валгаллу в скандинавской мифологии. Первоначальным автором Valgrind является Джулиан Сьюард , который в 2006 году выиграл премию Open Source Google-O'Reilly за свою работу над Valgrind.
Valgrind используется в ряде Linux-проектов.
Ограничения MemCheck
В дополнение к снижению производительности, существенным ограничением MemCheck является его неспособность находить граничные ошибки при использовании статических или помещенных в стек данных. Нижележащий код успешно проводит проверку Memcheck без каких-либо предупреждений, не глядя на указанные ошибки:
int Static[5];
int func(void)
{
int Stack[5];
Static[5] = 0; /* Ошибка - существует лишь Static[0] до Static[4], Static[5] выходит за пределы массива */
Stack [5] = 0; /* Ошибка - существует лишь Stack[0] до Stack[4], Stack[5] выходит за пределы массива */
return 0;
}
Экспериментальный инструмент EXP-sgcheck был написан для решения этого ограничения в MemCheck. Он находит ошибки переполнения массива, при условии что первый доступ к массиву находится в пределах границ массива. Обратите внимание, exp-sgcheck не находит переполнение массива в приведенном выше коде, так как первый доступ к массиву находится вне границ, но он обнаружит ошибку переполнения массива в следующем коде:
void func(void)
{
int i, Stack[5];
for (i = 0; i <= 5; i++)
Stack [i] = 0; /* Within bounds for i=0..4, out of bounds error when i=5 */
}
Невозможность обнаружить все ошибки, связанные с доступом стека данных выделяется особенно примечательно, так как определенные типы ошибок стека делают программное обеспечение уязвимым для классического переполнения стека.
https://en.wikipedia.org/wiki/Valgrind
https://ru.wikipedia.org/wiki/Valgrind
------------------------
ТРИО теплый пол отзыв
Заработок на сокращении ссылок
Earnings on reducing links
Код PHP на HTML сайты
Категория: Отладчики, Профилирование
Комментарии |
Информация Комментирование данной новости запрещено. |