Using Valgrind with Julia
Valgrind — это инструмент для отладки памяти, обнаружения утечек памяти и профилирования. Этот раздел описывает вещи, которые следует учитывать при использовании Valgrind для отладки проблем с памятью в Julia.
General considerations
По умолчанию Valgrind предполагает, что в программах, которые он запускает, нет самореферентного кода. Это предположение работает хорошо в большинстве случаев, но терпит неудачу для компилятора с компиляцией на лету, такого как 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
, попробуйте пересобрать sysimage с целевым generic
или julia с JULIA_CPU_TARGET=generic
.
Suppressions
Valgrind обычно будет отображать ложные предупреждения во время работы. Чтобы уменьшить количество таких предупреждений, полезно предоставить suppressions file Valgrind. Пример файла подавлений включен в дистрибутив исходного кода Julia по адресу contrib/valgrind-julia.supp
.
Файл подавлений можно использовать из каталога исходников julia/
следующим образом:
$ valgrind --smc-check=all-non-file --suppressions=contrib/valgrind-julia.supp ./julia progname.jl
Любые ошибки памяти, которые отображаются, должны быть либо зарегистрированы как ошибки, либо внесены как дополнительные подавления. Обратите внимание, что некоторые версии Valgrind являются shipped with insufficient default suppressions, так что это может быть одной из вещей, которые стоит учесть перед отправкой любых ошибок.
Running the Julia test suite under Valgrind
Возможно запустить весь тестовый набор Julia под Valgrind, но это занимает довольно много времени (обычно несколько часов). Чтобы сделать это, выполните следующую команду из директории 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
также.
Additional spurious warnings
Этот раздел охватывает предупреждения Valgrind, которые не могут быть добавлены в файл подавлений, но тем не менее безопасны для игнорирования.
Unhandled rr system calls
Valgrind выдаст предупреждение, если он встретит любое из system calls that are specific to rr, Record and Replay Framework. В частности, будет показано предупреждение о необработанном 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.
Эта проблема has been reported для разработчиков Valgrind, как они и просили.
Caveats
Valgrind в настоящее время does not support multiple rounding modes, поэтому код, который изменяет режим округления, будет вести себя иначе при выполнении под Valgrind.
В общем, если после установки --smc-check=all-non-file
вы обнаружите, что ваша программа ведет себя иначе при запуске под Valgrind, может помочь передать --tool=none
в valgrind
во время дальнейшего расследования. Это включит минимальную машину Valgrind, но также будет работать намного быстрее, чем при включенном полном проверщике памяти.