使用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开发者,因为他们已经要求。