Using Valgrind with Julia
Valgrind هو أداة لتصحيح أخطاء الذاكرة، واكتشاف تسرب الذاكرة، والتقييم. تصف هذه القسم الأشياء التي يجب مراعاتها عند استخدام Valgrind لتصحيح مشاكل الذاكرة مع Julia.
General considerations
بشكل افتراضي، يفترض Valgrind أنه لا يوجد كود يعدل نفسه في البرامج التي يقوم بتشغيلها. تعمل هذه الفرضية بشكل جيد في معظم الحالات لكنها تفشل بشكل رهيب مع مترجم الوقت الفعلي مثل julia
. لهذا السبب، من الضروري تمرير --smc-check=all-non-file
إلى valgrind
، وإلا قد يتعطل الكود أو يتصرف بشكل غير متوقع (غالبًا بطرق دقيقة).
في بعض الحالات، لتحسين اكتشاف أخطاء الذاكرة باستخدام Valgrind، يمكن أن يساعد في تجميع julia
مع تعطيل برك الذاكرة. علم الترجمة MEMDEBUG
يعطل برك الذاكرة في Julia، و MEMDEBUG2
يعطل برك الذاكرة في FemtoLisp. لبناء julia
مع كلا العلمين، أضف السطر التالي إلى Make.user
:
CFLAGS = -DMEMDEBUG -DMEMDEBUG2
شيء آخر يجب ملاحظته: إذا كان برنامجك يستخدم عمليات عمال متعددة، فمن المحتمل أنك تريد أن تعمل جميع هذه العمليات تحت Valgrind، وليس فقط العملية الأصلية. للقيام بذلك، مرر --trace-children=yes
إلى valgrind
.
شيء آخر يجب ملاحظته: إذا كنت تستخدم valgrind
وظهرت أخطاء مع Unable to find compatible target in system image
، حاول إعادة بناء sysimage مع الهدف generic
أو جوليا مع JULIA_CPU_TARGET=generic
.
Suppressions
سيعرض Valgrind عادةً تحذيرات زائفة أثناء تشغيله. لتقليل عدد هذه التحذيرات، يساعد تقديم suppressions file إلى Valgrind. تم تضمين ملف عينة للتحذيرات في توزيع مصدر جوليا في contrib/valgrind-julia.supp
.
يمكن استخدام ملف القمع من دليل مصدر julia/
على النحو التالي:
$ valgrind --smc-check=all-non-file --suppressions=contrib/valgrind-julia.supp ./julia progname.jl
يجب الإبلاغ عن أي أخطاء في الذاكرة تظهر إما كأخطاء أو المساهمة كإضافات إضافية. لاحظ أن بعض إصدارات Valgrind هي shipped with insufficient default suppressions، لذا قد تكون هذه واحدة من الأمور التي يجب أخذها في الاعتبار قبل تقديم أي أخطاء.
Running the Julia test suite under Valgrind
من الممكن تشغيل مجموعة اختبارات جوليا بالكامل تحت فالغرايند، لكن ذلك يستغرق وقتًا طويلاً (عادةً عدة ساعات). للقيام بذلك، قم بتشغيل الأمر التالي من دليل julia/test/
:
valgrind --smc-check=all-non-file --trace-children=yes --suppressions=$PWD/../contrib/valgrind-julia.supp ../julia runtests.jl all
إذا كنت ترغب في رؤية تقرير عن تسريبات الذاكرة "المؤكدة"، مرر العلامات --leak-check=full --show-leak-kinds=definite
إلى valgrind
أيضًا.
Additional spurious warnings
يتناول هذا القسم تحذيرات Valgrind التي لا يمكن إضافتها إلى ملف القمع ومع ذلك فهي آمنة للتجاهل.
Unhandled rr system calls
سيصدر Valgrind تحذيرًا إذا واجه أي من system calls that are specific to rr، و Record and Replay Framework. بشكل خاص، سيتم عرض تحذير حول استدعاء النظام 1008
غير المعالج عندما تحاول جوليا اكتشاف ما إذا كانت تعمل تحت rr:
--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.
هذه المشكلة has been reported إلى مطوري Valgrind كما طلبوا.
Caveats
فالجريند حاليًا does not support multiple rounding modes، لذا فإن الكود الذي يعدل وضع التقريب سيتصرف بشكل مختلف عند تشغيله تحت فالجريند.
بشكل عام، إذا وجدت أن برنامجك يتصرف بشكل مختلف عند تشغيله تحت Valgrind بعد تعيين --smc-check=all-non-file
، فقد يساعدك تمرير --tool=none
إلى valgrind
أثناء تحقيقك بشكل أعمق. سيمكنك هذا من استخدام الحد الأدنى من آلية Valgrind ولكنه سيعمل أيضًا بشكل أسرع بكثير من عندما يتم تمكين مدقق الذاكرة الكامل.