فالغريند

Valgrind ( / ˈ v æ l ɡ r ɪ n d / ) [ 6 ] هي أداة برمجة لتصحيح أخطاء الذاكرة ، واكتشاف تسرب الذاكرة ، والتحليل .

تم تصميم Valgrind في الأصل ليكون أداة تصحيح أخطاء الذاكرة المرخصة مجانًا لنظام Linux على x86 ، ولكنه تطور منذ ذلك الحين ليصبح إطار عمل عامًا لإنشاء أدوات تحليل ديناميكية مثل أدوات التحقق وأدوات تحليل الأداء.

ملخص

فالغريند هو في جوهره آلة افتراضية تستخدم تقنيات الترجمة الفورية ، بما في ذلك إعادة الترجمة الديناميكية . لا يتم تشغيل أي جزء من البرنامج الأصلي مباشرةً على المعالج المضيف . بدلاً من ذلك، يقوم فالغريند أولاً بترجمة البرنامج إلى شكل مؤقت أبسط يُسمى التمثيل الوسيط (IR)، وهو شكل ثابت يعتمد على تعيين واحد ، ولا يعتمد على نوع المعالج . بعد التحويل، يمكن لأي أداة (انظر أدناه) إجراء أي تحويلات ترغب بها على التمثيل الوسيط، قبل أن يقوم فالغريند بترجمته مرة أخرى إلى لغة الآلة، ثم يسمح للمعالج المضيف بتشغيله. يعيد فالغريند ترجمة الشفرة الثنائية لتشغيلها على المعالج المضيف والمعالج المستهدف (أو المعالجات المحاكاة) من نفس البنية. كما يتضمن أداة GDB stub للسماح بتصحيح أخطاء البرنامج المستهدف أثناء تشغيله في فالغريند، مع "أوامر مراقبة" تسمح بالاستعلام من أداة فالغريند عن معلومات متنوعة.

تُفقد نسبة كبيرة من الأداء في هذه التحويلات (وعادةً ما يكون ذلك في الكود الذي تُدرجه الأداة)؛ ففي العادة، يعمل الكود الذي يُشغّل باستخدام Valgrind وأداة "none" (التي لا تُجري أي تغييرات على التمثيل الوسيط) بسرعة تتراوح بين 20% و25% من سرعة البرنامج العادي. [ 7 ] [ 8 ]

أدوات

فحص الذاكرة

تتضمن Valgrind (بالإضافة إلى العديد من الأدوات الخارجية) أدوات متعددة. الأداة الافتراضية (والأكثر استخدامًا) هي Memcheck . تُضيف Memcheck شيفرة إضافية للمراقبة حول جميع التعليمات تقريبًا، لتتبع صحة البيانات (تبدأ جميع الذاكرة غير المُخصصة على أنها غير صالحة أو "غير مُعرّفة"، إلى أن يتم تهيئتها إلى حالة مُحددة، ربما من ذاكرة أخرى) وإمكانية الوصول إليها (ما إذا كان عنوان الذاكرة المعني يُشير إلى كتلة ذاكرة مُخصصة وغير مُحررة)، ويتم تخزين هذه البيانات في ما يُسمى بتات V وبتات A على التوالي. أثناء نقل البيانات أو معالجتها، تُراقب شيفرة المراقبة بتات A وV، بحيث تكون صحيحة دائمًا على مستوى البت الواحد.

In addition, Memcheck replaces the standard C++ allocators and C memory allocator with its own implementation, which also includes memory guards around all allocated blocks (with the A bits set to "invalid"). This feature enables Memcheck to detect off-by-one errors where a program reads or writes outside an allocated block by a small amount. The problems Memcheck can detect and warn about include the following:

  • Reading uninitialized memory
  • Reading/writing invalid memory which may be
    • memory that has been free'd
    • memory outside of malloc'd blocks
    • memory below the stack pointer
  • Use of incorrect parameters for system calls
  • Unsafe overlapping memory copies with mem* and str* functions
  • Memory leaks
  • Mismatched allocations and deallocations which may be
    • mixing C and C++ e.g., malloc and delete
    • mixing scalar and array e.g., new and delete[]
    • sized deallocation not the same size as allocation
    • aligned deallocation not the same alignment as allocation
  • Use of incorrect alignment
  • Use of realloc with a size of zero

The price of this is lost performance. Programs running under Memcheck usually run 20–30 times slower[9] than running outside Valgrind and use more memory (there is a memory penalty per allocation). Thus, few developers run their code under Memcheck (or any other Valgrind tool) all the time. They most commonly use such tools either to trace down some specific bug, or to verify that there are no latent bugs (of the kind Memcheck can detect) in the code.

Core errors

Part of the core of Valgrind always has to perform some checking on file descriptors (for instance to prevent the test executable from affecting Valgrind's log file or other output files). Checking can also be done for more general user errors affecting file descriptors. The kinds of errors that are detected are

  • closing a file descriptor that is not open
  • file descriptors that are not closed when the test executable exits
  • use of a file descriptor that was never created or was closed already

Starting with Valgrind 3.24 these errors are handled by Valgrind in the same way as other errors. That means that you can generate and use suppressions with them.

Valgrind 3.25 added a feature where you can change the behaviour of functions that create file descriptors. The default behaviour is the same as POSIX, which will return the lowest available file descriptor, potentially recycling closed file descriptors. There is the risk that the test executable will accidentally and erroneously use such a recycled file descriptor. Valgrind's --modify-fds option changes the behaviour to no longer respect the POSIX standard. Instead it will try to create a new file descriptor for each request.

أدوات أخرى

بالإضافة إلى Memcheck، يحتوي Valgrind على العديد من الأدوات الأخرى: [ 10 ]

  • لا يقوم برنامج None بتشغيل الكود في الجهاز الظاهري دون إجراء أي تحليل، وبالتالي فهو يتميز بأقل استهلاك ممكن لوحدة المعالجة المركزية والذاكرة مقارنةً بجميع الأدوات الأخرى. وبما أن Valgrind نفسه يوفر تتبعًا للأخطاء الناتجة عن خطأ تجزئة الذاكرة ، فإن برنامج none يوفر هذا التتبع بأقل قدر من الاستهلاك.
  • أداة Addrcheck ، المشابهة لأداة Memcheck ولكنها تستهلك موارد أقل بكثير من وحدة المعالجة المركزية والذاكرة، وبالتالي تكتشف أنواعًا أقل من الأخطاء. تم حذف أداة Addrcheck بدءًا من الإصدار 3.2.0. [ 11 ]
  • Massif ، وهو برنامج لتحليل أداء الذاكرة . تعرض واجهة المستخدم الرسومية المنفصلة massif-visualizer مخرجات برنامج Massif.
  • Helgrind و DRD ، يكتشفان حالات التزامن في التعليمات البرمجية متعددة الخيوط
  • Cachegrind ، أداة لتحليل أداء ذاكرة التخزين المؤقت . تعرض واجهة المستخدم الرسومية المنفصلة KCacheGrind مخرجات Cachegrind.
  • تمت إضافة Callgrind ، وهو محلل رسوم بيانية للمكالمات أنشأه جوزيف وايدندورفر، إلى Valgrind اعتبارًا من الإصدار 3.2.0. يمكن لـ KCacheGrind عرض مخرجات Callgrind.
  • DHAT ، أداة تحليل الذاكرة الديناميكية التي تحلل مقدار الذاكرة المخصصة ومدة تخصيصها، بالإضافة إلى أنماط استخدام الذاكرة.
  • exp-bbv ، وهو برنامج محاكاة أداء يقوم باستقراء الأداء من مجموعة عينات صغيرة.

تمت إزالة أداة exp-sgcheck (التي كانت تسمى exp-ptrcheck قبل الإصدار 3.7) في الإصدار 3.16.0. كانت أداة تجريبية للعثور على أخطاء تجاوز سعة المكدس والمصفوفة العامة، والتي لا يستطيع Memcheck العثور عليها.

تتوفر أيضًا العديد من الأدوات المطورة خارجيًا. إحدى هذه الأدوات هي ThreadSanitizer، وهي أداة أخرى لكشف حالات التزامن غير المتوقع . [ 12 ] [ 13 ]

المنصات المدعومة

ابتداءً من الإصدار 3.4.0، يدعم برنامج Valgrind أنظمة Linux على معالجات x86 و x86-64 و PowerPC . [ 14 ] أُضيف دعم Linux على معالج ARMv7 (المستخدم، على سبيل المثال، في بعض الهواتف الذكية ) في الإصدار 3.6.0. [ 15 ] [ 16 ] ابتداءً من الإصدار 3.7.0، أُضيف دعم منصة ARM/ Android . [ 17 ] أُضيف دعم Solaris في الإصدار 3.11.0. [ 18 ] أُضيف دعم OS X في الإصدار 3.5.0. [ 19 ] أُضيف دعم FreeBSD x86 و amd64 في الإصدار 3.18.0. [ 20 ] أُضيف دعم FreeBSD aarch64 في الإصدار 3.23.0. [ 21 ]

منذ الإصدار 3.9.0، يتوفر دعم لنظام لينكس على معالجات MIPS64 بنظامي البايتات الصغير والكبير، ولـ MIPS DSP ASE على معالجات MIPS32 ، ولتعليمات الفاصلة العائمة العشرية s390x ، ولتعليمات POWER8 ( Power ISA 2.07 )، ولتعليمات Intel AVX2 ، ولامتدادات مزامنة المعاملات من Intel، بنوعيها RTM وHLE، بالإضافة إلى دعم مبدئي لذاكرة المعاملات المادية على معالجات POWER. [ 22 ]

RISC-V 64 بت منذ الإصدار 3.25.0. [ 23 ]

تم تحسين دعم macOS 10.13 وتمت إضافة دعم macOS 10.14 [ 24 ] و 10.15 [ 25 ] و 11 [ 26 ] و 12 [ 27 ] و 13 [ 28 ] في Valgrind 3.27.

توجد منافذ غير رسمية لمنصات أخرى تشبه أنظمة يونكس (مثل OpenBSD ، [ 29 ] NetBSD [ 30 ] ، DragonFly BSD [ 31 ] و QNX [ 32 ] ).

التاريخ والتطور

يشير اسم فالغريند إلى المدخل الرئيسي إلى فالهالا في الأساطير الإسكندنافية . [ 33 ] [ 34 ] خلال مرحلة التطوير (قبل الإصدار)، كان اسم المشروع هايمدال ؛ إلا أن هذا الاسم كان سيتعارض مع حزمة أمنية. [ 33 ]

المؤلف الأصلي لبرنامج فالغريند هو جوليان سيوارد ، الذي فاز في عام 2006 بجائزة جوجل-أورايلي للمصادر المفتوحة عن عمله على فالغريند. [ 35 ] [ 36 ]

كما قدم العديد من الآخرين مساهمات كبيرة، بما في ذلك نيكولاس نذركوت، وبارت فان آش، وفلوريان كروهم، وتوم هيوز، وفيليب واروكيرز، ومارك ويلارد، وبول فلويد، وبيتر يوفانوفيتش، وكارل لوف، وبيتر بافلو، وإيفو رايسر. [ 37 ]

يستخدمه عدد من المشاريع القائمة على نظام لينكس. [ 38 ]

قيود برنامج Memcheck

إضافةً إلى تأثيره السلبي على الأداء، يتمثل أحد أهم عيوب أداة Memcheck في عدم قدرتها على اكتشاف جميع حالات أخطاء حدود الذاكرة عند استخدام البيانات الثابتة أو المُخصصة في مكدس الذاكرة. [ 39 ] سيجتاز الكود التالي اختبار أداة Memcheck في Valgrind بنجاح، على الرغم من احتوائه على الأخطاء الموضحة في التعليقات:

int a [ 5 ]; // مصفوفة ثابتة عامة بطول 5int main () { int b [ 5 ]; // مصفوفة مكدس بطول 5a [ 5 ] = 0 ; // خطأ - القيم من a[0] إلى a[4] موجودة، لكن a[5] خارج النطاق. b [ 5 ] = 0 ; // خطأ - القيم من b[0] إلى b[4] موجودة، لكن b[5] خارج النطاق.return 0 ; }

إن عدم القدرة على اكتشاف جميع الأخطاء المتعلقة بالوصول إلى البيانات المخصصة في المكدس أمر جدير بالملاحظة بشكل خاص لأن أنواعًا معينة من أخطاء المكدس تجعل البرامج عرضة لاستغلال كسر المكدس الكلاسيكي .

انظر أيضاً

ملحوظات

  1. "المؤلفون" . valgrind.org . مؤرشف من الأصل في 20 سبتمبر 2022. تم الاطلاع عليه في 19 سبتمبر 2022 .
  2. "مطورو فالغريند" . valgrind.org . مؤرشف من الأصل في 9 يوليو 2024. تم الاطلاع عليه في 28 أكتوبر 2025 .
  3. نيثركوت، نيكولاس (27 يوليو 2022). "عشرون عامًا من فالغريند" . nnethercote.github.io . مؤرشف من الأصل في 5 أغسطس 2023. تم الاطلاع عليه في 4 أغسطس 2023 .
  4. https://sourceforge.net/p/valgrind/mailman/message/59324626/ .{{cite web}}: مفقود أو فارغ |title=( مساعدة )
  5. 1 2 ويلارد، مارك (25 نوفمبر 2025). "Valgrind-3.26.0 متوفر الآن" . Valgrind-announce (قائمة بريدية) . تم الاطلاع عليه في 19 ديسمبر 2025 . يدعم هذا الإصدار أنظمة التشغيل التالية: X86/Linux، AMD64/Linux، ARM32/Linux، ARM64/Linux، PPC32/Linux، PPC64BE/Linux، PPC64LE/Linux، S390X/Linux، MIPS32/Linux، MIPS64/Linux، RISCV64/Linux، ARM/Android، ARM64/Android، MIPS32/Android، X86/Android، X86/Solaris، AMD64/Solaris، AMD64/MacOSX 10.12، X86/FreeBSD، AMD64/FreeBSD و ARM64/FreeBSD. كما يتوفر دعم مبدئي لأنظمة التشغيل التالية: X86/macOS 10.13، AMD64/macOS 10.13 و nanoMIPS/Linux.
  6. " أسئلة وأجوبة شائعة حول فالغريند" . valgrind.org . 1.1 كيف يُنطق اسم "فالغريند"؟ مؤرشف من الأصل في 4 مايو 2023. تم الاطلاع عليه في 4 مايو 2023. يُنطق "فال" كما في كلمة "قيمة". أما "غريند" فيُنطق بحرف "i" قصير - أي "غريند" (على وزن "تينند") وليس "غريند" (على وزن "فايند").
  7. "نبذة عن فالغريند" . valgrind.org . مؤرشف من الأصل بتاريخ 23 نوفمبر 2025. تم الاطلاع عليه بتاريخ 28 أكتوبر 2025 .
  8. "دليل فالغريند" (ملف PDF) . valgrind.org .
  9. "دليل البدء السريع لبرنامج فالغريند" . 3. تشغيل برنامجك باستخدام Memcheck. مؤرشف من الأصل بتاريخ 15 نوفمبر 2025. تم الاطلاع عليه بتاريخ 28 أكتوبر 2025 .
  10. "مجموعة أدوات فالغريند" . valgrind.org . مؤرشف من الأصل بتاريخ 29 أكتوبر 2025. تم الاطلاع عليه بتاريخ 28 أكتوبر 2025 .
  11. سيوارد، جوليان (8 يونيو 2006). "Valgrind-3.2.0 متوفر لأنظمة لينكس {x86، amd64، ppc32، ppc64}" . قائمة بريدية لمطوري Valgrind . تاريخ الاطلاع: 28 أكتوبر 2025 .
  12. "الإصدارات والتحديثات" . valgrind.org . مؤرشف من الأصل في 25 نوفمبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  13. سيريبرياني، كونستانتين؛ إسخودجانوف، تيمور (2009). ThreadSanitizer - الكشف عن تضارب البيانات عمليًا (ملف PDF) . وقائع ورشة عمل أدوات وتطبيقات البرمجة الثنائية WBIA. مؤرشف من الأصل (ملف PDF) في 11 يوليو 2011. تم الاطلاع عليه في 28 أكتوبر 2025 .
  14. سيوارد، جوليان (3 يناير 2009). "Valgrind-3.4.0 متوفر الآن" . Valgrind-announce (قائمة بريدية). مؤرشف من الأصل في 22 ديسمبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  15. lma (9 نوفمبر 2010). "يدعم Valgrind 3.6.0 معمارية ARMv7" . talk.maemo.org . مؤرشف من الأصل في 23 يناير 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  16. سيوارد، جوليان (21 أكتوبر 2010). "Valgrind-3.6.0 وValkyrie-2.0.0 متوفران الآن" . Valgrind-announce (قائمة بريدية). مؤرشف من الأصل في 23 ديسمبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  17. سيوارد، جوليان (7 نوفمبر 2011). "Valgrind-3.7.0 متوفر الآن" . Valgrind-announce (قائمة بريدية). مؤرشف من الأصل في 22 ديسمبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  18. سيوارد، جوليان (23 سبتمبر 2015). "Valgrind-3.11.0 متوفر" (قائمة بريدية) . تم الاطلاع عليه بتاريخ 28 أكتوبر 2025 .
  19. نذركوت، نيكولاس (28 مايو 2009). "نظام التشغيل ماك أو إس إكس مدعوم الآن على فرع فالغريند الرئيسي" . blog.mozilla.org . مؤرشف من الأصل في 22 ديسمبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  20. سيوارد، جوليان (18 نوفمبر 2021). "Valgrind-3.18.1 متوفر الآن" . Valgrind-announce (قائمة بريدية). مؤرشف من الأصل في 12 يناير 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  21. ويلارد، مارك (26 أبريل 2024). "Valgrind-3.23.0 متوفر الآن" . Valgrind-announce (قائمة بريدية). مؤرشف من الأصل في 17 يناير 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  22. سيوارد، جوليان (1 نوفمبر 2013). "Valgrind-3.9.0 متوفر الآن" . Valgrind-announce (قائمة بريدية). مؤرشف من الأصل في 1 مايو 2024. تم الاطلاع عليه في 28 أكتوبر 2025 .
  23. ويلارد، مارك (25 أبريل 2025). "Valgrind-3.25.0 متوفر الآن" . Valgrind-announce (القائمة البريدية). مؤرشف من الأصل في 22 ديسمبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  24. "موضوع: [ مطورون Valgrind ] [ valgrind ] داروين: إضافة دعم macOS 10.14 | Valgrind، مصحح أخطاء الذاكرة مفتوح المصدر" . sourceforge.net . مؤرشف من الأصل في 22 ديسمبر 2025. تم الاطلاع عليه في 20 ديسمبر 2025 .
  25. " [ مطورو Valgrind ] [ valgrind ] داروين: إضافة دعم macOS 10.15 | Valgrind، مصحح أخطاء الذاكرة مفتوح المصدر" . sourceforge.net . مؤرشف من الأصل في 23 ديسمبر 2025. تم الاطلاع عليه في 20 ديسمبر 2025 .
  26. " [ مطورو Valgrind ] [ valgrind ] خطأ رقم 513533 - دعم macOS 11.0 (Big Sur) | Valgrind، مصحح أخطاء الذاكرة مفتوح المصدر" . sourceforge.net . مؤرشف من الأصل في 22 ديسمبر 2025. تم الاطلاع عليه في 20 ديسمبر 2025 .
  27. " [ مطورون Valgrind ] [ valgrind ] خطأ رقم 513636 - دعم macOS 12.0 (مونتيري) | Valgrind، مصحح أخطاء الذاكرة مفتوح المصدر" . sourceforge.net . تم الاطلاع عليه بتاريخ 23 أبريل 2026 .
  28. " [ مطورو Valgrind ] [ valgrind ] خطأ رقم 513844 - دعم macOS 13.0 (Ventura) | Valgrind، مصحح أخطاء الذاكرة مفتوح المصدر" . sourceforge.net . تم الاطلاع عليه بتاريخ 23 أبريل 2026 .
  29. "devel/valgrind" . ports.su . مؤرشف من الأصل في 20 يناير 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  30. "منفذ Valgrind لنظام NetBSD" . vg4nbsd.berlios.de . مؤرشف من الأصل بتاريخ 9 فبراير 2006. تم الاطلاع عليه بتاريخ 28 يناير 2006 .
  31. DragonFlyBSD. "DPorts/devel/valgrind at master · DragonFlyBSD/DPorts" . GitHub . تم الاطلاع عليه بتاريخ 12 يناير 2026 .
  32. "الإصدار: rel9580" . community.qnx.com . مؤرشف من الأصل بتاريخ 24 مايو 2024. تم الاطلاع عليه بتاريخ 24 مايو 2024 .
  33. 1 2 "فالغريند" . valgrind.org . 1.2. من أين جاء اسم "فالغريند"؟ مؤرشف من الأصل في 30 مارس 2021. تم الاطلاع عليه في 28 أكتوبر 2025. تماشياً مع الطابع الإسكندنافي، تم اختيار فالغريند. فالغريند هو اسم المدخل الرئيسي إلى فالهالا (قاعة المختارين القتلى في أسغارد).
  34. "Grímnismál" . Völuspá.org . مؤرشف من الأصل في 23 يناير 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  35. "الجوائز" . valgrind.org . مؤرشف من الأصل في 4 نوفمبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  36. "جوائز جوجل-أورايلي للمصادر المفتوحة - قاعة المشاهير | مكتب برامج المصادر المفتوحة" . جوجل للمطورين . مؤرشف من الأصل في 30 أكتوبر 2025. تم الاطلاع عليه في 28 أكتوبر 2025 .
  37. "مطورو فالغريند" . valgrind.org . مؤرشف من الأصل في 9 يوليو 2024. تم الاطلاع عليه في 28 أكتوبر 2025 .
  38. "مشاريع تستخدم Valgrind" . valgrind.org . مؤرشف من الأصل بتاريخ 26 نوفمبر 2025. تم الاطلاع عليه بتاريخ 28 أكتوبر 2025 .
  39. "الأسئلة الشائعة حول Valgrind" . valgrind.org . 4.6. لماذا لا يكتشف Memcheck تجاوزات المصفوفة في هذا البرنامج؟ مؤرشف من الأصل في 30 مارس 2021. تم الاطلاع عليه في 28 أكتوبر 2025 .

مراجع