Использование 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, но при этом он будет работать намного быстрее, чем средство полной проверки памяти.