זרימת בקרה

dump#

גורם לתוכנית הרצה להפיק core dump מיידי.

dump הוא אופרטור Perl פרה־היסטורי שמטרתו המקורית הייתה להקפיא מפרש רץ לקובץ core כך שכלי השירות undump (שסופק בנפרד) יוכל להפוך את קובץ ה־core הזה בחזרה להרצה. הבינארי שנוצר, כשהורץ, היה מפעיל מחדש את התוכנית בקפיצה ל־LABEL דרך goto, תוך דילוג על עלות האתחול של קריאה והידור מחדש של המקור. זרימת עבודה זו מתה כבר עשורים: undump מעולם לא נשלח עם Perl, מערכות הפעלה מודרניות הופכות המרת core־להרצה לבלתי־אפשרית למעשה, והאופרטור כולו הוא כיום סקרנות היסטורית. החל מ־Perl 5.30 יש לאיית אותו CORE::dump() כדי להרתיע משימוש בשגגה.

אין כמעט מצב ב־Perl מודרני שבו dump הוא התשובה הנכונה. אם פנית אליו כי אתה רוצה stack trace, השתמש ב־Carp::confess. אם אתה רוצה לצאת באופן חריג, השתמש ב־die או ב־exit. אם אתה רוצה תצלום של מצב התוכנית, השתמש בכלי נקודת־ביקורת ברמת מערכת ההפעלה.

תקציר#

CORE::dump();
CORE::dump LABEL;
CORE::dump EXPR;

מה מקבלים בחזרה#

שום דבר. dump אינו מחזיר: השליטה עוזבת את מפרש Perl בדרך ש־abort(3) עוזב תוכנית C. התהליך מסיים על־ידי טיפול ה־core־dump של הקרנל (בסגנון SIGABRT), עם תופעות הלוואי הרגילות: סטטוס יציאה המשקף את האות, אפשרות לקובץ core בספרייה הנוכחית אם RLIMIT_CORE של המשתמש ו־core_pattern של הקרנל מתירים זאת, וללא כיבוי מסודר של זמן הריצה של Perl. בלוקי END אינם רצים. שיטות DESTROY אינן רצות. פלט מאוגר על כל מטפל קובץ אבוד.

מצב גלובלי שהוא נוגע בו#

אין ישירות. dump עוקף לחלוטין את מנגנון סיום־התוכנית הרגיל - אינו קורא או כותב משתנים מיוחדים, אינו עושה flush למאגרים, ואינו מריץ הורסים. כל מצב שבו המפרש נמצא ברגע הקריאה הוא מה שנוחת בקובץ ה־core.

דוגמאות#

הפעלת core dump מתוך תוכנית רצה (דורש CORE:: החל מ־5.30):

CORE::dump();

עם תווית - במקור, הבינארי שיוצר על־ידי undump היה מחדש את הביצוע כאן. עם undump שאיננו, זה דקורטיבי בלבד; התהליך עדיין פשוט נקטע:

RESTART:
    # ... initialisation ...
CORE::dump RESTART;

שם תווית מחושב בזמן ריצה (הצורה dump EXPR, זמינה מאז Perl 5.18):

my $label = pick_entry_point();
CORE::dump $label;

מה שאתה כמעט בוודאות רוצה במקום. ל־post-mortem עם stack trace:

use Carp;
Carp::confess("unreachable state: $state");

ליציאה חריגה נקייה עם קוד סטטוס:

die "fatal: $reason\n";      # exit via $@, runs END / DESTROY
exit 1;                      # plain exit, runs END / DESTROY

מקרי קצה#

  • איות מאז 5.30: dump חשוף או dump LABEL ברמת הוראה הוא שגיאת זמן הידור אלא אם כן נכתב כ־CORE::dump או CORE::dump(...). זה מכוון - צוות הליבה הקשה על הגעה לאופרטור בשגגה.

  • LABEL אינו נפתר בזמן הקריאה: היסטורית התווית נחפשה רק לאחר ש־undump החיה את התוכנית, כך ששגיאת הקלדה לא הייתה נתפסת בזמן ה־dump. כיום הנקודה אינה רלוונטית - התוכנית לעולם אינה מתחדשת, כך שהתווית היא תיעוד טהור.

  • dump EXPR: הביטוי מוערך בהקשר סקלר וחייב להניב שם תווית. אין לו השפעה על התוצאה, מאותה סיבה.

  • מוזרויות פענוח: ל־dump יש אותה קדימות כמו השמה והוא פטור מכלל הנראה־כמו־פונקציה. dump ("foo") . "bar" מפורש כש־"bar" הוא חלק מהארגומנט, לא כשרשור לאחר. בפועל זה רלוונטי רק אם אתה כותב dump בכלל, מה שאינך אמור לעשות.

  • קבצים פתוחים אבודים: כל מטפל קובץ פתוח ברגע ה־dump נעלם כאשר (בזרימת העבודה ההיסטורית) התוכנית המוחדשת מתחילה. אזהרת ה־POD על ״בלבול אפשרי שייגרם ל־Perl״ היא מהעידן שבו מישהו עוד היה עשוי לנסות זאת; כיום האזהרה היא אקדמית כי שום דבר אינו מתחדש.

  • ייתכן שקובצי core לא ייווצרו: האם קובץ core אכן נוחת בדיסק תלוי ב־ulimit -c, ב־kernel.core_pattern של הקרנל, בהרשאות מערכת הקבצים, ובאם התהליך רץ תחת מפקח שלוכד או משליך קובצי core. הצלחת dump בקטיעת התהליך אינה זהה לזמינות קובץ core לאחר מכן.

  • ניידות: במערכות ללא תמיכת core-dump משמעותית האופרטור מצטמצם ל־״לקטוע את התהליך״; ראה perlport להערות היסטוריות.

הבדלים מהמקור#

תאימות מלאה עם Perl 5.42 המקורי.

ראו גם#

  • exit - מסיים את התוכנית באופן רגיל, מריץ בלוקי END והורסים; זה מה שאתה כמעט בוודאות רוצה במקום dump

  • die - מעלה חריגה; ללא מטפל הוא מסיים את התוכנית אך עדיין מריץ בלוקי END ועושה flush לפלט

  • goto - אופרטור העברת השליטה שצורת ה־LABEL שלו dump היה אמור היסטורית לשתף איתו פעולה לאחר ההתחדשות

  • Carp::confess - stack-trace-on-exit, התשובה המודרנית ל־״אני רוצה לראות את מצב התוכנית בנקודת הכישלון״

  • warn - פולט אבחנה מבלי לסיים; שלב עם מודול stack-trace כשאתה רוצה מידע ללא קטיעה

  • perlrun - מתעד את מתג שורת־הפקודה ההיסטורי -u שמבצע dump מיד לאחר ההידור