Sanitizer support
Sanitizers يمكن استخدامه في بناءات جوليا المخصصة لتسهيل اكتشاف أنواع معينة من الأخطاء في كود جوليا الداخلي بلغة C/C++.
Address Sanitizer: easy build
من مصدر فحص لجوليا، يجب أن تكون قادرًا على بناء إصدار يدعم تعقيم العناوين في جوليا وLLVM على النحو التالي:
$ mkdir /tmp/julia
$ contrib/asan/build.sh /tmp/julia/
هنا اخترنا /tmp/julia
كدليل بناء، ولكن يمكنك اختيار أي شيء تريده. بمجرد البناء، قم بتشغيل الحمل الذي ترغب في اختباره باستخدام /tmp/julia/julia
. ستؤدي أخطاء الذاكرة إلى حدوث أخطاء.
إذا كنت بحاجة إلى تخصيص أو مزيد من التفاصيل، يرجى الاطلاع على الوثائق أدناه.
General considerations
استخدام أدوات التحقق من الأخطاء في Clang يتطلب منك بالطبع استخدام Clang (USECLANG=1
)، ولكن هناك نقطة أخرى: تتطلب معظم أدوات التحقق من الأخطاء مكتبة وقت التشغيل، التي يوفرها المترجم المضيف، بينما يعتمد الكود الذي تم تزويده بالأدوات الذي تم إنشاؤه بواسطة JIT الخاص بـ Julia على وظائف من تلك المكتبة. وهذا يعني أن إصدار LLVM الخاص بمترجمك المضيف يجب أن يتطابق مع إصدار مكتبة LLVM المستخدمة داخل Julia.
حل سهل هو إنشاء مجلد بناء مخصص لتوفير أداة مطابقة، من خلال البناء باستخدام BUILD_LLVM_CLANG=1
. يمكنك بعد ذلك الإشارة إلى هذه الأداة من مجلد بناء آخر عن طريق تحديد USECLANG=1
مع تجاوز متغيرات CC
و CXX
.
تظهر أخطاء المعقمات عندما تكتشف مكتبة مشتركة يتم فتحها باستخدام RTLD_DEEPBIND
(مرجع: google/sanitizers#611). نظرًا لأن 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.user
الخاص بك، حتى لا تحتاج إلى تذكرها في كل مرة).
Address Sanitizer (ASAN)
لكشف أو تصحيح أخطاء الذاكرة، يمكنك استخدام Clang's address sanitizer (ASAN). من خلال الترجمة باستخدام SANITIZE_ADDRESS=1
، يمكنك تفعيل ASAN لمترجم جوليا والكود الذي تم إنشاؤه. بالإضافة إلى ذلك، يمكنك تحديد LLVM_SANITIZE=1
لتطهير مكتبة LLVM أيضًا. لاحظ أن هذه الخيارات تتطلب تكلفة عالية من حيث الأداء والذاكرة. على سبيل المثال، استخدام ASAN لجوليا وLLVM يجعل testall1
يستغرق 8-10 مرات أطول بينما يستخدم 20 مرة من الذاكرة (يمكن تقليل ذلك إلى عامل 3 و4 على التوالي باستخدام الخيارات الموضحة أدناه).
بشكل افتراضي، تقوم جوليا بتعيين علامة allow_user_segv_handler=1
لـ ASAN، والتي تُعتبر ضرورية لعمل تسليم الإشارات بشكل صحيح. يمكنك تعريف خيارات أخرى باستخدام علامة البيئة ASAN_OPTIONS
، وفي هذه الحالة ستحتاج إلى تكرار الخيار الافتراضي المذكور سابقًا. على سبيل المثال، يمكن تقليل استخدام الذاكرة عن طريق تحديد fast_unwind_on_malloc=0
و malloc_context_size=2
، على حساب دقة تتبع الأخطاء. في الوقت الحالي، تقوم جوليا أيضًا بتعيين detect_leaks=0
، ولكن يجب إزالة ذلك في المستقبل.
Example setup
Step 1: Install toolchain
قم بفحص شجرة عمل Git (أو إنشاء دليل بناء خارج الشجرة) في $TOOLCHAIN_WORKTREE
وأنشئ ملف تكوين $TOOLCHAIN_WORKTREE/Make.user
مع
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
Step 2: Build Julia with ASAN
قم بفحص شجرة عمل Git (أو إنشاء دليل بناء خارج الشجرة) في $BUILD_WORKTREE
وأنشئ ملف تكوين $BUILD_WORKTREE/Make.user
مع
TOOLCHAIN=$(TOOLCHAIN_WORKTREE)/usr/tools
# use our new toolchain
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
# make the GC use regular malloc/frees, which are hooked by ASAN
override WITH_GC_DEBUG_ENV=1
# default to a debug build for better line number reporting
override JULIA_BUILD_MODE=debug
# make ASAN consume less memory
export ASAN_OPTIONS=detect_leaks=0:fast_unwind_on_malloc=0:allow_user_segv_handler=1:malloc_context_size=2
JULIA_PRECOMPILE=1
# tell libblastrampoline to not use RTLD_DEEPBIND
export LBT_USE_RTLD_DEEPBIND=0
تشغيل:
cd $BUILD_WORKTREE
make debug
لبناء julia-debug
مع ASAN.
Memory Sanitizer (MSAN)
For detecting use of uninitialized memory, you can use Clang's memory sanitizer (MSAN) by compiling with SANITIZE_MEMORY=1
.
Thread Sanitizer (TSAN)
لإصلاح مشاكل سباقات البيانات وغيرها من القضايا المتعلقة بالخيوط، يمكنك استخدام Clang's thread sanitizer (TSAN) عن طريق الترجمة مع SANITIZE_THREAD=1
.