在Julia中使用Valgrind
一般规定
默认情况下,Valgrind假定其执行的程序中没有自修改代码。 这个假设在大多数情况下都有效,但它不适用于像julia这样的JIT编译器。 出于这个原因,将`--smc-check=all-non-file`传递给valgrind工具是非常重要的,否则代码可能会崩溃或意外行为(通常相当微妙)。
在某些情况下,使用禁用的内存池编译julia可以帮助使用Valgrind更有效地检测内存错误。 编译时标志’MEMDEBUG’在Julia中禁用内存池,'MEMDEBUG2’在FemtoLisp中禁用内存池。 要使用两个标志构建`julia`,请在’Make’中添加以下行。用户档案:
CFLAGS = -DMEMDEBUG -DMEMDEBUG2
还有一点:如果您的程序使用多个工作流,您很可能希望所有这些工作流(不仅仅是父进程)从Valgrind运行。 为此,将`--trace-children=yes’传递给’valgrind’工具。
另外值得注意的是,如果在使用`valgrind`时出现`无法在系统映像中找到兼容目标`错误,请尝试使用`generic`目标对象或使用`JULIA_CPU_TARGET=generic`重建系统映像。
抑制
Valgrind在操作过程中通常会发出错误警告。 为了减少此类警告的数量,建议提供Valgrind https://valgrind.org/docs/manual/manual-core.html#manual-core.suppress [抑制文件]。 示例抑制文件包含在文件`contrib/valgrind-julia的Julia源代码分发中。supp'。
抑制文件可以从`julia/`源代码目录中使用,如下所示:
$valgrind--smc-check=all-non-file--suppressions=contrib/valgrind-julia。苏普。/朱莉娅progname.jl
显示的任何内存错误都应报告为错误或修复为其他抑制。 请注意,某些版本的Valgrind https://github.com/JuliaLang/julia/issues/8314#issuecomment-55766210 [附带的默认抑制不足],因此在发送任何错误之前应考虑这一点。
其他虚假警告
本节讨论尚未添加到抑制文件的Valgrind警告,但是可以安全地忽略这些警告。
原始rr系统调用
Valgrind发出警告时,任何https://github.com/rr-debugger/rr/blob/master/src/preload/rrcalls …h[与rr相关的系统调用],https://rr-project.org /[录制和播放框架]。 特别是,如果Julia环境试图确定它是否正在运行rr,则会显示有关原始系统调用`1008`的警告。:
--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.
关于这个问题https://bugs.kde.org/show_bug.cgi?id=446401 [据报导]应Valgrind开发人员的要求。
警告
目前Valgrind https://bugs.kde.org/show_bug.cgi?id=136779 [不支持多种舍入模式],因此调整舍入模式的代码在Valgrind中运行时会有不同的工作方式。
一般来说,如果在安装`--smc-check=all-non-file’后,您发现程序的行为与在Valgrind中运行时的行为不同,建议在进一步调查后将`--tool=none`传递给`valgrind’工具。 这将使用最小的Valgrind机制,但它的工作速度比全内存检查器快得多。