Valgrind тесно связан с особенностями процессора, операционной системы и, в меньшей степени, компилятора и основных библиотек С. Это затрудняет его переносимость, поэтому мы с самого начала сконцентрировались на том, что мы считаем широко использующейся платформой: Linux на x86. Valgrind использует стандартный механизм Unix './configure
', 'make
', 'make install
', и мы попытались обеспечить его работу на машинах с ядром 2.2 или 2.4 и glibc 2.1.X, 2.2.X или 2.3.1. Это должно охватить значительное большинство современных установок Linux. Обратите внимание, что glibc-2.3.2+ с пакетом NPTL (Native POSIX Thread Library — собственная библиотека потоков POSIX) не будет работать. Мы надеемся исправить это, но это будет нелегко.
Если вы используете GNU/Linux на другой платформе или используете коммерческую систему Unix, Valgrind не окажет вам большой помощи. Однако, поскольку системы GNU/Linux на x86 довольно обычны (и вполне доступны), вполне вероятно, что вы сможете приобрести ее с умеренным бюджетом, или по крайней мере, занять на время! Что еще, когда Valgrind нашел для вас проблему, она исправляется для
Хотя из руководства Valgrind у вас могло сложиться впечатление, что существуют отдельные команды memcheck
, addrcheck
и т.д., это не так. Вместо этого программа оболочки драйвера с именем valgrind
запускает отладочное ядро с соответствующей «оболочкой», указанной в опции --skin=
. Оболочкой по умолчанию является memcheck
; таким образом, запуск просто valgrind
равносильно 'valgrind --skin=memcheck
' (Это обеспечивает совместимость с более ранними версиями Valgrind, которые осуществляли лишь проверку памяти, это имеет также больший смысл, поскольку оболочка memcheck
предоставляет большую часть сведений.)
Valgrind предусматривает ряд опций. За всеми подробностями мы отсылаем вас к его документации. Опции поделены на две группы; из тех, которые используются с ядром (т. е. работают для всех оболочек), наиболее полезными могут быть следующие:
--gdb-attach=no/yes
Запускается с подключенным к процессу GDB для интерактивной отладки. По умолчанию используется no
.
--help
Перечисляет опции.
--logfile=
Записывает сообщения в
.
--num-callers=
Выводит
--skin=
Использует соответствующую memcheck
.
--trace-children=no|yes
Запускает трассировку также в порожденных процессах. По умолчанию используется no
.
-V
, --verbose
Использует более полный вывод. Это включает перечисление загруженных библиотек, а также подсчеты всех различных видов ошибок.
Из опций для оболочки memcheck
мы полагаем, что эти являются наиболее полезными.
--leak-check=no|yes
Искать утечки памяти после завершения программы. По умолчанию используется no
.
--show-reachable=no|yes
Показать доступные блоки после завершения программы. Если используется --show-reachable=yes
, Valgrind ищет динамически выделенную память, на которую все еще есть указывающий на нее указатель. Такая память не является утечкой, но о ней все равно следует знать. По умолчанию используется no
.
Давайте посмотрим на Valgrind в действии. Помните ch15-badmem.c
? (См. раздел 15.5.2.2 «Electric Fence».) Опция -b
записывает в память, находящуюся вне выделенного malloc()
блока. Вот что сообщает Valgrind:
$ valgrind ch15-badmem1 -b
1 ==8716== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux.
2 ==8716== Copyright (C) 2002-2003, and GNU GPL'd, by Julian Seward.
3 ==8716== Using valgrind-20030725, a program supervision framework for x86-linux.