Использование Valgrind в Julia

Valgrind — это инструмент для отладки памяти, обнаружения утечек памяти и профилирования. В этом разделе описываются особенности, которые следует иметь в виду при использовании Valgrind для отладки проблем с памятью в Julia.

Общие положения

По умолчанию Valgrind предполагает, что в программах, которые он выполняет, нет самоизменяющегося кода. Это предположение действует в большинстве случаев, но не работает для JIT-компилятора, такого как julia. По этой причине очень важно передавать --smc-check=all-non-file инструменту valgrind, иначе код может аварийно завершиться или повести себя неожиданно (часто довольно тонко).

В некоторых случаях для более эффективного обнаружения ошибок памяти с помощью Valgrind может помочь компиляция julia с отключенными пулами памяти. Флаг времени компиляции MEMDEBUG отключает пулы памяти в Julia, а MEMDEBUG2 отключает пулы памяти в FemtoLisp. Чтобы собрать julia с обоими флагами, добавьте следующую строку в файл Make.user:

CFLAGS = -DMEMDEBUG -DMEMDEBUG2

Еще один момент: если ваша программа использует несколько рабочих процессов, скорее всего, вы захотите, чтобы все эти рабочие процессы (а не только родительский процесс) запускались с Valgrind. Для этого передайте --trace-children=yes инструменту valgrind.

Стоит также отметить, что если при использовании valgrind возникают ошибки с Unable to find compatible target in system image, попробуйте пересобрать образ системы с помощью целевого объекта generic или julia с помощью JULIA_CPU_TARGET=generic.

Подавления

Во время работы Valgrind обычно выдает ложные предупреждения. Чтобы уменьшить количество таких предупреждений, рекомендуется предоставить Valgrind файл подавлений. Образец файла подавлений включен в дистрибутив исходного кода Julia в файле contrib/valgrind-julia.supp.

Файл подавлений можно использовать из каталога исходного кода julia/ следующим образом:

$ valgrind --smc-check=all-non-file --suppressions=contrib/valgrind-julia.supp ./julia progname.jl

О любых ошибках памяти, которые отображаются, следует либо сообщать как об ошибках, либо фиксировать в качестве дополнительных подавлений. Обратите внимание, что некоторые версии Valgrind поставляются с недостаточными подавлениями по умолчанию, так что этот момент следует учитывать перед отправкой любых ошибок.

Запуск набора тестов Julia в Valgrind

В Valgrind можно запустить весь набор тестов Julia, но это займет довольно много времени (обычно несколько часов). Для этого выполните следующую команду из каталога julia/test/:

valgrind --smc-check=all-non-file --trace-children=yes --suppressions=$PWD/../contrib/valgrind-julia.supp ../julia runtests.jl all

Если вы хотите увидеть отчет об «определенных» утечках памяти, передайте флаги --leak-check=full --show-leak-kinds=definite инструменту valgrind.

Дополнительные фиктивные предупреждения

В этом разделе рассматриваются предупреждения Valgrind, которые пока нельзя добавить в файл подавлений, но которые, однако, можно спокойно игнорировать.

Необработанные системные вызовы rr

Valgrind выдает предупреждение при обнаружении любого системного вызова, относящегося к rr, фреймворку записи и воспроизведения. В частности, предупреждение о необработанном системном вызове 1008 выводится в том случае, если среда Julia пытается определить, работает ли она под управлением rr:

--xxxxxx-- WARNING: unhandled amd64-linux syscall: 1008
--xxxxxx-- You may be able to write your own handler.
--xxxxxx-- Read the file README_MISSING_SYSCALL_OR_IOCTL.
--xxxxxx-- Nevertheless we consider this a bug.  Please report
--xxxxxx-- it at http://valgrind.org/support/bug_reports.html.

Об этой проблеме было сообщено разработчикам Valgrind по их запросу.

Предупреждения

В настоящее время Valgrind не поддерживает несколько режимов округления, поэтому код, который настраивает режим округления, будет работать по-разному при запуске в Valgrind.

В общем, если после установки --smc-check=all-non-file вы обнаружите, что программа ведет себя иначе, чем при запуске в Valgrind, рекомендуется передать --tool=none инструменту valgrind при дальнейшем исследовании. Это позволит задействовать минимальный механизм Valgrind, но при этом он будет работать намного быстрее, чем средство полной проверки памяти.