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 ولكنه سيعمل أيضًا بشكل أسرع بكثير من عندما يتم تمكين مدقق الذاكرة الكامل.