Using Valgrind with Julia
Valgrind es una herramienta para depuración de memoria, detección de fugas de memoria y perfilado. Esta sección describe cosas a tener en cuenta al usar Valgrind para depurar problemas de memoria con Julia.
General considerations
Por defecto, Valgrind asume que no hay código que se modifica a sí mismo en los programas que ejecuta. Esta suposición funciona bien en la mayoría de los casos, pero falla miserablemente para un compilador just-in-time como julia
. Por esta razón, es crucial pasar --smc-check=all-non-file
a valgrind
, de lo contrario, el código puede fallar o comportarse de manera inesperada (a menudo de formas sutiles).
En algunos casos, para detectar mejor los errores de memoria utilizando Valgrind, puede ser útil compilar julia
con los grupos de memoria desactivados. La bandera de compilación MEMDEBUG
desactiva los grupos de memoria en Julia, y MEMDEBUG2
desactiva los grupos de memoria en FemtoLisp. Para compilar julia
con ambas banderas, agrega la siguiente línea a Make.user
:
CFLAGS = -DMEMDEBUG -DMEMDEBUG2
Otra cosa a tener en cuenta: si tu programa utiliza múltiples procesos de trabajo, es probable que desees que todos esos procesos de trabajo se ejecuten bajo Valgrind, no solo el proceso principal. Para hacer esto, pasa --trace-children=yes
a valgrind
.
Otra cosa a tener en cuenta: si al usar valgrind
aparece el error Unable to find compatible target in system image
, intenta reconstruir la imagen del sistema con el objetivo generic
o julia con JULIA_CPU_TARGET=generic
.
Suppressions
Valgrind normalmente mostrará advertencias espurias mientras se ejecuta. Para reducir el número de tales advertencias, ayuda proporcionar un suppressions file a Valgrind. Un archivo de suprimidos de muestra está incluido en la distribución de origen de Julia en contrib/valgrind-julia.supp
.
El archivo de supresiones se puede utilizar desde el directorio fuente julia/
de la siguiente manera:
$ valgrind --smc-check=all-non-file --suppressions=contrib/valgrind-julia.supp ./julia progname.jl
Cualquier error de memoria que se muestre debe ser reportado como errores o contribuido como supresiones adicionales. Tenga en cuenta que algunas versiones de Valgrind son shipped with insufficient default suppressions, así que eso puede ser algo a considerar antes de enviar cualquier error.
Running the Julia test suite under Valgrind
Es posible ejecutar toda la suite de pruebas de Julia bajo Valgrind, pero toma bastante tiempo (típicamente varias horas). Para hacerlo, ejecuta el siguiente comando desde el directorio julia/test/
:
valgrind --smc-check=all-non-file --trace-children=yes --suppressions=$PWD/../contrib/valgrind-julia.supp ../julia runtests.jl all
Si deseas ver un informe de fugas de memoria "definidas", pasa las banderas --leak-check=full --show-leak-kinds=definite
a valgrind
también.
Additional spurious warnings
Esta sección cubre las advertencias de Valgrind que no se pueden agregar al archivo de supresiones, pero que, no obstante, son seguras de ignorar.
Unhandled rr system calls
Valgrind emitirá una advertencia si encuentra alguno de los system calls that are specific to rr, el Record and Replay Framework. En particular, se mostrará una advertencia sobre una llamada al sistema 1008
no manejada cuando julia intente detectar si se está ejecutando bajo 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.
Este problema has been reported a los desarrolladores de Valgrind como han solicitado.
Caveats
Valgrind actualmente does not support multiple rounding modes, por lo que el código que ajusta el modo de redondeo se comportará de manera diferente cuando se ejecute bajo Valgrind.
En general, si después de establecer --smc-check=all-non-file
encuentras que tu programa se comporta de manera diferente cuando se ejecuta bajo Valgrind, puede ser útil pasar --tool=none
a valgrind
mientras investigas más a fondo. Esto habilitará la maquinaria mínima de Valgrind, pero también se ejecutará mucho más rápido que cuando se habilita el verificador de memoria completo.