ניפוי שגיאות בתוכניות Perl#

Perl מגיעה עם מערך כלי ניפוי שגיאות מלא באופן יוצא דופן: מנפה שגיאות מובנה הפועל הוראה־אחר־הוראה, מסַייר של מנוע הביטויים הרגולריים, API מתועד לכתיבת מנפי שגיאות חלופיים, ומערכת אקולוגית של CPAN הכוללת פרופיילרים, מאתרי דליפות, כלי post-mortem, ושילובי IDE. המימוש מחדש של pperl משמר את נקודות ה־hook של הפרשן, ולכן כל הערימה עובדת: perl -d, Devel::NYTProf, Devel::Cover, Perl::LanguageServer, ושאר משפחת -d:Module.

איזה פרק רלוונטי עבורי?#

תסמין

התחילו כאן

התוכנית מתנהגת באופן שגוי ואני רוצה לבחון אותה בזמן ריצה

interactive-debugger

התוכנית קורסת עם הודעה סתומה

exceptions

אני רוצה לפזר prints ו־dumps

print-and-die

אני רוצה להפוך טעויות נוספות לשגיאות הידור

preflight

אני צריך לעצור בשורה מסוימת או בתנאי מסוים

breakpoints

אני צריך לראות מה מבנה נתונים מחזיק בפועל

inspecting-state

אני רוצה לראות כל שורה / sub בעת הביצוע

tracing

אני רוצה breakpoints ב־VS Code / Neovim

ide-dap

שלוש שכבות המדריך#

  • התמצאות - דף זה.

  • המתכנת בעבודה - הפרקים שלעיל. כל אחד עומד בפני עצמו; קריאת פרק יחיד מספיקה לפתרון הבעיה שהוא מציין.

פערים ידועים#

תחומי ניפוי שגיאות שבהם המערכת האקולוגית עצמה דלילה, או שבהם המימוש של pperl עדיין לא הגיע לשוויון עם upstream. הם מצוינים כאן כדי שהקוראים לא יבזבזו זמן עליהם.

  • פורמט פלט של ה־regex tracer. מנוע ה־regex של pperl הוא מימוש מחדש מקומי; use re 'debug' מפיק עקבה אך שמות הצמתים ופורמטי השדות אינם זהים בית־לבית לאלה של perl5. צרכנים המנתחים את העקבה (קיימים מעטים) יזדקקו להתאמה.

  • מודולי אינטרוספקציה B::*. B::Deparse, B::Concise, ומקביליהם חושפים את גרף ה־op של perl5. ייצוג ה־op של pperl שונה; המקבילים המקומיים בעבודה.

  • מודולי אינטרוספקציה תלויי־XS. משפחת Devel::Peek, Devel::FindRef, Devel::Gladiator, Devel::Refcount, Devel::Size, Devel::MAT::Dumper, Devel::Leak - כולם ניגשים ל־SV דרך XS (מקרואים ברמת C נגד המצביע ל־SV). זמן הריצה p5 של pperl משקף את פריסת ה־SV של perl5 בנאמנות, אך טעינת XS אינה נתמכת; מודולים אלה זקוקים אפוא למימושים מקומיים מחודשים (ב־Rust) החושפים את אותו ה־API ברמת Perl. פונקציונליות דמוית־Devel::Peek בפיור־פרל כבר מסופקת באופן מקומי על־ידי ה־Devel::Peek המובנה; האחרים בעבודה.

  • Enbugger ב־Perl ≥ 5.38. המהדורה האחרונה משנת 2012; פועלת באופן אנקדוטלי בגרסאות perl מודרניות אך אין לה מתחזק פעיל. המסלול של gdb-inject-perl אמין יותר.

  • מקור async. אין מקבילה ב־Perl ל־AsyncLocalStorage של Node: Future שנכשל ב־callback מרוחק אינו נושא רישום אוטומטי של מי שתִזמן אותו.

  • Breadcrumbs של Sentry. Sentry::Raven פונקציונלי אך במצב תחזוקה־בלבד; אין תמיכה מדרגה־ראשונה ב־breadcrumbs. OpenTelemetry Perl SDK הוא המסלול קדימה להתקנות חדשות.

  • Perl::LanguageServer attach-to-running-process. הפעלה (launch) נתמכת; חיבור post-hoc אינו נתמך.

ראו גם#