对消毒器的支持
一般规定
显然,要使用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`。