Αποσφαλμάτωση προγραμμάτων Perl#

Η Perl διαθέτει μια ασυνήθιστα πλήρη επιφάνεια αποσφαλμάτωσης: έναν ενσωματωμένο αποσφαλματωτή που δουλεύει δήλωση προς δήλωση, έναν ιχνηλάτη της μηχανής regex, ένα τεκμηριωμένο API για τη συγγραφή εναλλακτικών αποσφαλματωτών, και ένα οικοσύστημα στο CPAN από προφίλερ, εντοπιστές διαρροών, εργαλεία post-mortem, και ενσωματώσεις IDE. Η εκ νέου υλοποίηση της pperl διατηρεί τα σημεία hook του διερμηνέα, οπότε όλη η στοίβα δουλεύει: perl -d, Devel::NYTProf, Devel::Cover, Perl::LanguageServer, και η υπόλοιπη οικογένεια -d:Module.

Ποιο κεφάλαιο θέλω;#

Σύμπτωμα

Ξεκινήστε εδώ

Το πρόγραμμα συμπεριφέρεται παράξενα και θέλω να το επιθεωρήσω ζωντανά

interactive-debugger

Το πρόγραμμα καταρρέει με ένα κρυπτικό μήνυμα

exceptions

Θέλω να σκορπίσω print και dump

print-and-die

Θέλω να μετατρέψω περισσότερα λάθη σε σφάλματα μεταγλώττισης

preflight

Πρέπει να σταματήσω σε μια συγκεκριμένη γραμμή ή συνθήκη

breakpoints

Πρέπει να δω τι περιέχει πραγματικά μια δομή δεδομένων

inspecting-state

Θέλω να βλέπω κάθε γραμμή / sub καθώς εκτελείται

tracing

Θέλω breakpoints στο VS Code / Neovim

ide-dap

Τα τρία επίπεδα αυτού του οδηγού#

  • Προσανατολισμός - αυτή η σελίδα.

  • Προγραμματιστής στη δουλειά - τα κεφάλαια που αναφέρονται παραπάνω. Κάθε ένα είναι αυτοτελές· η ανάγνωση ενός μόνον αρκεί για να λύσει το πρόβλημα που κατονομάζει.

Γνωστά κενά#

Επιφάνειες αποσφαλμάτωσης όπου το ίδιο το οικοσύστημα είναι ισχνό, ή όπου η υλοποίηση της 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 φέρει τον πλήρη αποσφαλματωτή.