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והורסים; זה מה שאתה כמעט בוודאות רוצה במקוםdumpdie- מעלה חריגה; ללא מטפל הוא מסיים את התוכנית אך עדיין מריץ בלוקיENDועושה flush לפלטgoto- אופרטור העברת השליטה שצורת ה־LABELשלוdumpהיה אמור היסטורית לשתף איתו פעולה לאחר ההתחדשותCarp::confess- stack-trace-on-exit, התשובה המודרנית ל־״אני רוצה לראות את מצב התוכנית בנקודת הכישלון״warn- פולט אבחנה מבלי לסיים; שלב עם מודול stack-trace כשאתה רוצה מידע ללא קטיעהperlrun- מתעד את מתג שורת־הפקודה ההיסטורי-uשמבצעdumpמיד לאחר ההידור