Engee 文档

在Julia中使用Valgrind

https://valgrind.org /[Valgrind]是一个调试内存、检测内存泄漏和分析的工具。 本节介绍使用Valgrind调试Julia内存问题时要记住的功能。

一般规定

默认情况下,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中运行Julia测试套件

您可以在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-types=define’传递给valgrind工具。

其他虚假警告

本节讨论尚未添加到抑制文件的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机制,但它的工作速度比全内存检查器快得多。