Ροή ελέγχου

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 και τους καταστροφείς· αυτό είναι που σχεδόν σίγουρα θέλετε αντί της dump

  • die - εγείρει εξαίρεση· χωρίς χειριστή τερματίζει το πρόγραμμα αλλά εξακολουθεί να εκτελεί τα μπλοκ END και να εκκενώνει την έξοδο

  • goto - ο τελεστής μεταφοράς ελέγχου του οποίου η μορφή LABEL η dump ιστορικά υποτίθεται ότι συνεργαζόταν μαζί της μετά τη μετενσάρκωση

  • Carp::confess - ίχνος στοίβας κατά την έξοδο, η σύγχρονη απάντηση στο «θέλω να δω την κατάσταση του προγράμματος στο σημείο της αποτυχίας»

  • warn - εκπέμπει διαγνωστικό χωρίς τερματισμό· συνδυάστε με άρθρωμα ίχνους στοίβας όταν θέλετε πληροφορία χωρίς να τερματίσετε

  • perlrun - τεκμηριώνει τον ιστορικό διακόπτη γραμμής εντολών -u που εκτελεί dump αμέσως μετά τη μεταγλώττιση