Engee 文档

对消毒器的支持

在自定义Julia构建中,您可以使用https://github.com/google/sanitizers [sanitizers]以便更容易识别Julia内部C/C代码中的某些类型的错误++.

地址消毒器:易于组装

基于提取的Julia源代码,您可以在Julia和LLVM中创建支持地址清理的版本。:

$ mkdir /tmp/julia
$ contrib/asan/build.sh /tmp/julia/

这里选择了构建目录`/tmp/julia`,但它可以是您选择的任何目录。 构建完成后,使用`/tmp/julia/julia’运行需要测试的工作负载。 将报告所有内存错误。

有关包括配置在内的更多信息,请参阅下面的文档。

一般规定

显然,要使用Clang消毒器,您将需要使用Clang(`USECLANG=1'),但还有一点:大多数消毒器需要主编译器提供的运行时库,但JIT Julia生成的检测代码依赖于此库的功能。 因此,主编译器的LLVM版本必须与Julia中使用的LLVM库的版本相匹配。

要解决此问题,您可以简单地创建一个特殊的构建文件夹,通过使用参数`BUILD_LLVM_CLANG=1’执行构建来提供适当的工具集。 然后,通过在重新定义`CC`和`CXX`变量时指定`USECLANG=1`参数,可以从另一个构建文件夹引用此工具包。

当找到使用`RTLD_DEEPBIND’打开的共享文件夹时,消毒程序返回错误(请参阅https://github.com/google/sanitizers/issues/611 [google/sanitizers#611])。 自图书馆https://github.com/staticfloat/libblastrampoline [libblastrampoline]默认使用’RTLD_DEEPBIND'。 使用消毒器时,必须设置环境变量’LBT_USE_RTLD_DEEPBIND=0'。

要使用其中一种消毒器,请设置’SANITIZE=1',然后为所需的消毒器设置适当的标志。

MacOS上可能需要额外的标志。 一般来说,它可能看起来像这样,添加一个标志`SANITIZE_*`或下面列出的几个标志。

make -C deps USE_BINARYBUILDER_LLVM=0 LLVM_VER=svn stage-llvm

make -C src SANITIZE=1 USECLANG=1 \
    CC=~+/deps/scratch/llvm-svn/build_Release/bin/clang \
    CXX=~+/deps/scratch/llvm-svn/build_Release/bin/clang++ \
    CPPFLAGS="-isysroot $(xcode-select -p)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" \
    CXXFLAGS="-isystem $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1"

您也可以将此代码放在"Make"中。用户的文件,这样你就不必每次都记住它。

地址消毒器(ASAN)

要检测或调试内存错误,可以使用https://clang.llvm.org/docs/AddressSanitizer.html [地址消毒器(ASAN)]叮当。 通过使用`SANITIZE_ADDRESS=1`参数进行编译,您可以为Julia编译器及其生成的代码启用ASAN。 此外,您还可以指定’LLVM_SANITIZE=1’来清理LLVM库。 请记住,这些参数会导致计算和内存资源的高成本。 例如,当将Asan用于Julia和LLVM时’testall1’运行的时间长8-10倍,消耗的内存多20倍(使用下面描述的参数,这些数字可以分别减少3倍和4倍)。

默认情况下,Julia设置ASAN标志`allow_user_segv_handler=1`,这是正确传递信号所必需的。 使用环境标志’ASS_OPTIONS',您可以设置其他参数;在这种情况下,您将不得不重复先前指定的默认参数。 例如,通过指定’fast_unwind_on_malloc=0’和’malloc_context_size=2',可以通过回溯精度降低内存消耗。 目前Julia还设置了参数’detect_leaks=0',但是这将在将来更改。

配置示例

步骤1。 安装工具包

将Git工作树(或创建树外构建目录)解压缩到`TOOL TOOLCHAIN_WORKTREE`并创建配置文件`$TOOLCHAIN_WORKTREE/Make。用户’具有以下内容:

USE_BINARYBUILDER_LLVM=1
BUILD_LLVM_CLANG=1

运行以下命令:

cd $TOOLCHAIN_WORKTREE
make -C deps install-llvm install-clang install-llvm-tools

在`$TOOLCHAIN_WORKTREE/usr/tools’中安装工具包的二进制文件。

第二步。 与ASAN一起建立Julia

将Git工作树(或创建树外构建目录)解压缩到`$BUILD_WORKTREE`并创建配置文件`$BUILD_WORKTREE/Make。用户’具有以下内容:

TOOLCHAIN=$(TOOLCHAIN_WORKTREE)/usr/tools

# используем новый набор инструментальных средств
USECLANG=1
override CC=$(TOOLCHAIN)/clang
override CXX=$(TOOLCHAIN)/clang++
export ASAN_SYMBOLIZER_PATH=$(TOOLCHAIN)/llvm-symbolizer

USE_BINARYBUILDER_LLVM=1

override SANITIZE=1
override SANITIZE_ADDRESS=1

# предписываем сборщику мусора использовать обычные операции выделения и освобождения памяти, к которым привязан ASAN
override WITH_GC_DEBUG_ENV=1

# используем по умолчанию отладочную сборку для более точной информации о номерах строк
override JULIA_BUILD_MODE=debug

# сокращаем объем памяти, потребляемый ASAN
export ASAN_OPTIONS=detect_leaks=0:fast_unwind_on_malloc=0:allow_user_segv_handler=1:malloc_context_size=2

JULIA_PRECOMPILE=1

# предписываем libblastrampoline не использовать RTLD_DEEPBIND
export LBT_USE_RTLD_DEEPBIND=0

运行以下命令:

cd $BUILD_WORKTREE
make debug

使用ASAN构建`julia-debug`。

记忆消毒器(MSAN)

要检测未初始化内存的使用情况,可以使用https://clang.llvm.org/docs/MemorySanitizer.html [memory Sanitizer(MSAN)]通过使用参数`SANITIZE_MEMORY=1`进行编译来叮当作响。

流动消毒器(TSAN)

要调试数据竞赛和其他线程相关的问题,您可以使用https://clang.llvm.org/docs/ThreadSanitizer.html [thread sanitizer(TSAN)]通过使用参数`SANITIZE_THREAD=1`进行编译而叮当作响。