dump#
Προκαλεί στο εκτελούμενο πρόγραμμα να παράγει αμέσως core dump.
Η dump είναι προϊστορικός τελεστής της Perl του οποίου ο αρχικός σκοπός ήταν να παγώσει έναν εκτελούμενο διερμηνέα σε αρχείο core ώστε το (παρεχόμενο ξεχωριστά) εργαλείο undump να μπορέσει να μετατρέψει αυτό το αρχείο core πίσω σε εκτελέσιμο. Το προκύπτον δυαδικό, όταν εκτελούνταν, θα επανεκκινούσε το πρόγραμμα κάνοντας άλμα στο LABEL μέσω goto, παρακάμπτοντας το κόστος εκκίνησης της επανανάγνωσης και επαναμεταγλώττισης του πηγαίου κώδικα. Αυτή η ροή εργασίας είναι νεκρή για δεκαετίες: το undump δεν διανεμήθηκε ποτέ μαζί με την Perl, τα σύγχρονα λειτουργικά συστήματα καθιστούν τη μετατροπή core-σε-εκτελέσιμο ουσιαστικά αδύνατη, και ολόκληρος ο τελεστής είναι πλέον μια ιστορική περιέργεια. Από την Perl 5.30 και μετά πρέπει να γράφεται CORE::dump() ώστε να αποθαρρύνεται η κατά λάθος χρήση.
Δεν υπάρχει σχεδόν καμία κατάσταση στη σύγχρονη Perl όπου η dump είναι η σωστή απάντηση. Αν την επιλέξατε επειδή θέλετε ίχνος στοίβας, χρησιμοποιήστε Carp::confess. Αν θέλετε αφύσικη έξοδο, χρησιμοποιήστε die ή exit. Αν θέλετε στιγμιότυπο της κατάστασης του προγράμματος, χρησιμοποιήστε εργαλείο checkpointing σε επίπεδο λειτουργικού.
Σύνοψη#
CORE::dump();
CORE::dump LABEL;
CORE::dump EXPR;
Τι επιστρέφεται#
Τίποτα. Η dump δεν επιστρέφει: ο έλεγχος εγκαταλείπει τον διερμηνέα της Perl με τον τρόπο που η abort(3) εγκαταλείπει ένα πρόγραμμα C. Η διεργασία τερματίζεται από τον χειρισμό core dump του πυρήνα (τύπου SIGABRT), με τις συνήθεις παρενέργειες: μια κατάσταση εξόδου που αντικατοπτρίζει το σήμα, ένα πιθανό αρχείο core στον τρέχοντα κατάλογο αν το RLIMIT_CORE του χρήστη και το core_pattern του πυρήνα το επιτρέπουν, και κανένα ομαλό τερματισμό του runtime της Perl. Τα μπλοκ END δεν εκτελούνται. Οι μέθοδοι DESTROY δεν εκτελούνται. Η ενταμιευμένη έξοδος σε οποιοδήποτε filehandle χάνεται.
Καθολική κατάσταση που επηρεάζει#
Καμία άμεσα. Η dump παρακάμπτει εντελώς τον κανονικό μηχανισμό τέλους προγράμματος - δεν διαβάζει ούτε γράφει ειδικές μεταβλητές, δεν εκκενώνει ενταμιευτές, και δεν εκτελεί καταστροφείς. Όποια κι αν είναι η κατάσταση του διερμηνέα τη στιγμή της κλήσης, αυτή προσγειώνεται στο αρχείο 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;
Αυτό που σχεδόν σίγουρα θέλετε αντί αυτής. Για μεταθανάτια ανάλυση με ίχνος στοίβας:
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(...). Αυτό είναι σκόπιμο - η ομάδα του core έκανε τον τελεστή δύσκολο να προσεγγιστεί κατά λάθος.Το
LABELδεν επιλύεται κατά την κλήση: ιστορικά η ετικέτα αναζητούνταν μόνο αφού τοundumpμετενσάρκωνε το πρόγραμμα, οπότε ένα τυπογραφικό λάθος δεν θα εντοπιζόταν κατά τη στιγμή τηςdump. Σήμερα το θέμα είναι ασήμαντο - το πρόγραμμα δεν συνεχίζει ποτέ, οπότε η ετικέτα είναι καθαρή τεκμηρίωση.Η
dump EXPR: η έκφραση αποτιμάται σε βαθμωτό περιβάλλον και πρέπει να αποδίδει όνομα ετικέτας. Δεν έχει επίδραση στο αποτέλεσμα, για τον ίδιο λόγο.Ιδιορρυθμίες ανάλυσης: η
dumpέχει την ίδια προτεραιότητα με την ανάθεση και εξαιρείται από τον κανόνα «μοιάζει-με-συνάρτηση». Ηdump ("foo") . "bar"αναλύεται με το"bar"ως μέρος του ορίσματος, όχι ως μεταγενέστερη συνένωση. Στην πράξη αυτό έχει σημασία μόνο αν γράφετεdumpκαθόλου, κάτι που δεν θα έπρεπε.Τα ανοιχτά αρχεία χάνονται: κάθε filehandle που είναι ανοιχτό τη στιγμή της
dumpεξαφανίζεται όταν (στην ιστορική ροή εργασίας) ξεκινά το μετενσαρκωμένο πρόγραμμα. Η προειδοποίηση στο POD για «πιθανή σύγχυση που προκαλείται στην Perl» χρονολογείται από την εποχή που κάποιος μπορεί όντως να το δοκίμαζε· σήμερα η προειδοποίηση είναι ακαδημαϊκή επειδή τίποτα δεν συνεχίζει.Τα αρχεία core μπορεί να μην παραχθούν: το αν ένα αρχείο core προσγειώνεται όντως στον δίσκο εξαρτάται από το
ulimit -c, τοkernel.core_patternτου πυρήνα, τα δικαιώματα του συστήματος αρχείων, και το αν η διεργασία τρέχει υπό supervisor που συλλαμβάνει ή απορρίπτει αρχεία core. Το να επιτύχει ηdumpστον τερματισμό της διεργασίας δεν είναι το ίδιο με το να είναι διαθέσιμο μετά κάποιο αρχείο core.Φορητότητα: σε συστήματα χωρίς ουσιαστική υποστήριξη core dump ο τελεστής συρρικνώνεται σε «τερμάτισε τη διεργασία»· δείτε το
perlportγια ιστορικές σημειώσεις.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
exit- τερματίζει κανονικά το πρόγραμμα, εκτελώντας τα μπλοκENDκαι τους καταστροφείς· αυτό είναι που σχεδόν σίγουρα θέλετε αντί τηςdumpdie- εγείρει εξαίρεση· χωρίς χειριστή τερματίζει το πρόγραμμα αλλά εξακολουθεί να εκτελεί τα μπλοκENDκαι να εκκενώνει την έξοδοgoto- ο τελεστής μεταφοράς ελέγχου του οποίου η μορφήLABELηdumpιστορικά υποτίθεται ότι συνεργαζόταν μαζί της μετά τη μετενσάρκωσηCarp::confess- ίχνος στοίβας κατά την έξοδο, η σύγχρονη απάντηση στο «θέλω να δω την κατάσταση του προγράμματος στο σημείο της αποτυχίας»warn- εκπέμπει διαγνωστικό χωρίς τερματισμό· συνδυάστε με άρθρωμα ίχνους στοίβας όταν θέλετε πληροφορία χωρίς να τερματίσετεperlrun- τεκμηριώνει τον ιστορικό διακόπτη γραμμής εντολών-uπου εκτελείdumpαμέσως μετά τη μεταγλώττιση