Reporting and analyzing crashes (segfaults)

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

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

Version/Environment info

بغض النظر عن الخطأ، سنحتاج دائمًا إلى معرفة إصدار جوليا الذي تستخدمه. عند بدء جوليا لأول مرة، يتم طباعة رأس يحتوي على رقم الإصدار والتاريخ. يرجى أيضًا تضمين ناتج versioninfo() (المصدر من مكتبة InteractiveUtils) في أي تقرير تقوم بإنشائه:

julia> using InteractiveUtils
julia> versioninfo()Julia Version 1.11.5 Commit 760b2e5* (2025-04-14 06:53 UTC) Platform Info: OS: Linux (x86_64-linux-gnu) CPU: 2 × AMD EPYC 7763 64-Core Processor WORD_SIZE: 64 LLVM: libLLVM-16.0.6 (ORCJIT, znver3) Threads: 64 default, 0 interactive, 2 GC (on 2 virtual cores) Environment: JULIA_NUM_THREADS = 64

Segfaults during bootstrap (sysimg.jl)

تعتبر الأخطاء الفادحة (Segfaults) في نهاية عملية make لبناء جوليا (Julia) عرضًا شائعًا لحدوث خطأ ما أثناء قيام جوليا بتحليل مجموعة التعليمات البرمجية في مجلد base/. يمكن أن تساهم العديد من العوامل في وفاة هذه العملية بشكل غير متوقع، ومع ذلك، غالبًا ما يكون ذلك بسبب خطأ في جزء كود C من جوليا، وبالتالي يجب عادةً تصحيح الأخطاء باستخدام بناء تصحيح داخل gdb. بشكل صريح:

إنشاء بناء تصحيح لـ Julia:

$ cd <julia_root>
$ make debug

لاحظ أن هذه العملية من المحتمل أن تفشل بنفس الخطأ مثل تعويذة make العادية، ومع ذلك، ستقوم هذه العملية بإنشاء ملف تنفيذي للتصحيح سيقدم لـ gdb الرموز التصحيحية اللازمة للحصول على تتبعات دقيقة. بعد ذلك، قم بتشغيل عملية التمهيد يدويًا داخل gdb:

$ cd base/
$ gdb -x ../contrib/debug_bootstrap.gdb

سيبدأ هذا gdb، وسيحاول تشغيل عملية التمهيد باستخدام بناء جوليّا التصحيحي، وسيطبع تتبعًا للخلف إذا (عندما) يحدث خطأ في الذاكرة. قد تحتاج إلى الضغط على <enter> عدة مرات للحصول على تتبع كامل للخلف. أنشئ gist مع تتبع الخلف، و version info، وأي معلومات أخرى ذات صلة يمكنك التفكير فيها، وافتح issue جديد على GitHub مع رابط إلى الجست.

Segfaults when running a script

الإجراء مشابه جدًا لـ Segfaults during bootstrap (sysimg.jl). أنشئ بناءً تصحيحياً لـ Julia، وقم بتشغيل سكريبتك داخل عملية Julia مصححة:

$ cd <julia_root>
$ make debug
$ gdb --args usr/bin/julia-debug <path_to_your_script>

لاحظ أن gdb ستبقى هناك، تنتظر التعليمات. اكتب r لتشغيل العملية، و bt لتوليد تتبع الخلفية بمجرد حدوث خطأ في الوصول إلى الذاكرة:

(gdb) r
Starting program: /home/sabae/src/julia/usr/bin/julia-debug ./test.jl
...
(gdb) bt

إنشاء gist مع تتبع الأخطاء، و version info، وأي معلومات أخرى ذات صلة يمكنك التفكير فيها وفتح issue جديد على GitHub مع رابط إلى الجست.

Errors during Julia startup

أحيانًا تحدث أخطاء أثناء عملية بدء تشغيل جوليا (خاصة عند استخدام التوزيعات الثنائية، بدلاً من التجميع من المصدر) مثل ما يلي:

$ julia
exec: error -5

تشير هذه الأخطاء عادةً إلى أن شيئًا ما لا يتم تحميله بشكل صحيح في وقت مبكر جدًا من مرحلة الإقلاع، وأفضل رهان لدينا في تحديد ما هو الخطأ هو استخدام أدوات خارجية لمراجعة نشاط القرص لعملية julia:

  • على لينكس، استخدم strace:

    $ strace julia
  • على نظام OSX، استخدم dtruss:

    $ dtruss -f julia

إنشاء gist مع مخرجات strace/ dtruss، و version info، وأي معلومات ذات صلة أخرى وفتح issue جديدة على GitHub مع رابط إلى الجست.

Other generic segfaults or unreachables reached

كما ذُكر في أماكن أخرى، فإن julia لديها تكامل جيد مع rr لتوليد التتبع؛ وهذا يشمل، على نظام Linux، القدرة على تشغيل julia تلقائيًا تحت rr ومشاركة التتبع بعد حدوث عطل. يمكن أن يكون هذا مفيدًا للغاية عند تصحيح مثل هذه الأعطال ويُنصح بشدة عند الإبلاغ عن مشكلات الأعطال إلى مستودع JuliaLang/julia. لتشغيل julia تلقائيًا تحت rr، قم بما يلي:

julia --bug-report=rr

لإنشاء تتبع rr محليًا، ولكن دون مشاركته، يمكنك القيام بما يلي:

julia --bug-report=rr-local

لاحظ أن هذا يعمل فقط على لينكس. تحتوي التدوينة على Time Travelling Bug Reporting على مزيد من التفاصيل.

Glossary

تم استخدام بعض المصطلحات كاختصارات في هذا الدليل:

  • <julia_root> يشير إلى الدليل الجذري لشجرة مصدر جوليا؛ على سبيل المثال، يجب أن يحتوي على مجلدات مثل base و deps و src و test وغيرها.....