Αποσφαλμάτωση προγραμμάτων Perl#
Η Perl διαθέτει μια ασυνήθιστα πλήρη επιφάνεια αποσφαλμάτωσης: έναν ενσωματωμένο αποσφαλματωτή που δουλεύει δήλωση προς δήλωση, έναν ιχνηλάτη της μηχανής regex, ένα τεκμηριωμένο API για τη συγγραφή εναλλακτικών αποσφαλματωτών, και ένα οικοσύστημα στο CPAN από προφίλερ, εντοπιστές διαρροών, εργαλεία post-mortem, και ενσωματώσεις IDE. Η εκ νέου υλοποίηση της pperl διατηρεί τα σημεία hook του διερμηνέα, οπότε όλη η στοίβα δουλεύει: perl -d, Devel::NYTProf, Devel::Cover, Perl::LanguageServer, και η υπόλοιπη οικογένεια -d:Module.
Ποιο κεφάλαιο θέλω;#
Σύμπτωμα | Ξεκινήστε εδώ |
|---|---|
Το πρόγραμμα συμπεριφέρεται παράξενα και θέλω να το επιθεωρήσω ζωντανά | |
Το πρόγραμμα καταρρέει με ένα κρυπτικό μήνυμα | |
Θέλω να σκορπίσω print και dump | |
Θέλω να μετατρέψω περισσότερα λάθη σε σφάλματα μεταγλώττισης | |
Πρέπει να σταματήσω σε μια συγκεκριμένη γραμμή ή συνθήκη | |
Πρέπει να δω τι περιέχει πραγματικά μια δομή δεδομένων | |
Θέλω να βλέπω κάθε γραμμή / sub καθώς εκτελείται | |
Θέλω breakpoints στο VS Code / Neovim |
Τα τρία επίπεδα αυτού του οδηγού#
Προσανατολισμός - αυτή η σελίδα.
Προγραμματιστής στη δουλειά - τα κεφάλαια που αναφέρονται παραπάνω. Κάθε ένα είναι αυτοτελές· η ανάγνωση ενός μόνον αρκεί για να λύσει το πρόβλημα που κατονομάζει.
Γνωστά κενά#
Επιφάνειες αποσφαλμάτωσης όπου το ίδιο το οικοσύστημα είναι ισχνό, ή όπου η υλοποίηση της pperl δεν έχει φτάσει σε ισοτιμία με το upstream. Κατονομάζονται εδώ ώστε οι αναγνώστες να μη σπαταλούν χρόνο σε αυτές.
Μορφή εξόδου του ιχνηλάτη regex. Η μηχανή regex της pperl είναι μια ντόπια εκ νέου υλοποίηση· το
use re 'debug'παράγει ίχνος αλλά τα ονόματα κόμβων και οι μορφές πεδίων δεν είναι byte-πανομοιότυπες με αυτές της 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 runtime της pperl αντικατοπτρίζει πιστά τη διάταξη SV της perl5, αλλά η φόρτωση XS δεν υποστηρίζεται· συνεπώς αυτά τα αρθρώματα χρειάζονται ντόπιες (σε Rust) εκ νέου υλοποιήσεις που εκθέτουν το ίδιο API επιπέδου Perl. Η λειτουργικότητα τύπουDevel::Peekσε καθαρή Perl παρέχεται ήδη ντόπια από το ενσωματωμένοDevel::Peek· τα υπόλοιπα είναι σε εξέλιξη.Το
Enbuggerσε Perl ≥ 5.38. Τελευταία έκδοση το 2012· δουλεύει ανέκδοτα σε σύγχρονες perl αλλά δεν έχει ενεργό συντηρητή. Η διαδρομήgdb-inject-perlείναι πιο αξιόπιστη.Προέλευση async. Δεν υπάρχει ισοδύναμο στην Perl με το
AsyncLocalStorageτου Node: έναFutureπου αποτυγχάνει σε μια απομακρυσμένη επανάκληση δεν φέρει αυτόματη εγγραφή του ποιος το προγραμμάτισε.Breadcrumbs Sentry. Το
Sentry::Ravenείναι λειτουργικό αλλά μόνο σε φάση συντήρησης· δεν διαθέτει υποστήριξη breadcrumb πρώτης τάξης. Το OpenTelemetry Perl SDK είναι ο μελλοντικός δρόμος για νέες εγκαταστάσεις.Σύνδεση του
Perl::LanguageServerσε εκτελούμενη διεργασία. Η εκκίνηση υποστηρίζεται· η εκ των υστέρων σύνδεση όχι.
Δείτε επίσης#
perlfunc/die,perlfunc/warn,perlfunc/eval,perlfunc/caller- τα γλωσσικά πρωτογενή πάνω στα οποία οικοδομούνται ο αποσφαλματωτής και τα εργαλεία ίχνους στοίβας.PPerl Architecture guide - τα δύο runtimes και γιατί μόνο το p5 φέρει τον πλήρη αποσφαλματωτή.