AnyMath 文档

使用Valgrind与Julia

Valgrind是一个用于内存调试、内存泄漏检测和分析的工具。 本节介绍使用Valgrind调试Julia的内存问题时要注意的事项。

一般考虑因素

默认情况下,Valgrind假定它运行的程序中没有自修改代码。 这个假设在大多数情况下都很好,但对于一个准时的编译器来说却很糟糕。 朱莉娅. 出于这个原因,至关重要的是通过 --smc-check=全非文件瓦格林德,否则代码可能会崩溃或意外行为(通常以微妙的方式)。

在某些情况下,为了更好地使用Valgrind检测内存错误,它可以帮助编译 朱莉娅 禁用内存池。 编译时标志 梅德布格 禁用Julia中的内存池,以及 MEMDEBUG2 禁用FemtoLisp中的内存池。 建造 朱莉娅 使用这两个标志,将以下行添加到 做吧。用户:

CFLAGS = -DMEMDEBUG -DMEMDEBUG2

还有一点要注意:如果你的程序使用多个工作进程,很可能你希望所有这样的工作进程都在Valgrind下运行,而不仅仅是父进程。 要做到这一点,通过 --trace-children=是瓦格林德.

还有一件事要注意:如果使用 瓦格林德 错误与 无法在系统映像中找到兼容的目标,尝试使用target重建sysimage 通用型 或朱莉娅与 JULIA_CPU_TARGET=泛型.

抑制,抑制

Valgrind通常会在运行时显示虚假警告。 为了减少这种警告的数量,它有助于提供一个https://valgrind.org/docs/manual/manual-core.html#manual-core.suppress[抑制文件]到Valgrind。 一个示例抑制文件包含在Julia源发行版中, contrib/valgrind-朱莉娅。苏普.

抑制文件可以从 朱莉娅/ 源目录如下:

$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测试套件,但确实需要相当长的时间(通常是几个小时)。 为此,请从 朱莉娅/测试/ 目录:

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警告。

未处理的rr系统调用

Valgrind会发出警告,如果它遇到任何https://github.com/rr-debugger/rr/blob/master/src/preload/rrcalls.h[特定于rr的系统调用],https://rr-project.org/[记录和重播框架]。 特别是关于未处理的警告 1008 当julia尝试检测它是否在rr下运行时,将显示syscall:

--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=全非文件 你发现你的程序在Valgrind下运行时表现不同,它可能有助于通过 --工具=无瓦格林德 当你进一步调查的时候。 这将启用最小的Valgrind机器,但也将比启用全内存检查器时运行得快得多。