Ο διαδραστικός αποσφαλματωτής#
Αυτό το κεφάλαιο καλύπτει το perl -d: εκκίνηση προγράμματος υπό τον αποσφαλματωτή, την προτροπή, τις απαραίτητες εντολές κίνησης και επιθεώρησης, και το λεξιλόγιο πλοήγησης στη στοίβα. Μετά από αυτό το κεφάλαιο μπορείτε να διερευνήσετε διαδραστικά οποιοδήποτε εκτελούμενο πρόγραμμα.
Οι αναγνώστες ξεκινούν γνωρίζοντας ότι τα print / warn δουλεύουν αλλά δεν αρκούν: πρέπει να σταματήσετε, να κοιτάξετε γύρω σας, να ρίξετε ματιά σε μεταβλητές, να διασχίσετε τη στοίβα κλήσεων, και μετά να συνεχίσετε. Αυτό προσφέρει αυτό το κεφάλαιο.
Εκκίνηση#
Για οποιοδήποτε σενάριο app.pl, προσθέστε -d μπροστά:
perl -d app.pl --verbose input.txt
Τα ορίσματα μετά το όνομα του σεναρίου περνούν στο σενάριο κανονικά.
Συνηθισμένες μορφές εκκίνησης:
Μορφή | Σκοπός |
|---|---|
| Αποσφαλμάτωση του δοθέντος σεναρίου. |
| Αποσφαλμάτωση έκφρασης μονογράμμου. |
| Διαδραστικό sandbox REPL. |
| Φόρτωση του |
| Προφιλάρισμα μέσω του πρόσθετου NYTProf. |
| Αναζήτηση του |
Το -d αναγκάζει τον μεταγλωττιστή να εκπέμπει σημεία hook ανά δήλωση· ο διερμηνέας προφορτώνει το perl5db.pl πριν την πρώτη γραμμή χρόνου εκτέλεσης.
Μη σωληνώνετε ποτέ είσοδο στο perl -d και μη χρησιμοποιείτε ποτέ το /dev/stdin - ο αποσφαλματωτής χρειάζεται TTY για να διαβάσει εντολές. Εκκινήστε από πραγματικό τερματικό.
Η προτροπή#
Loading DB routines from perl5db.pl version 1.77
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(app.pl:4): my $key = 'welcome';
DB<1>
Η γραμμή main::(app.pl:4): δείχνει την επόμενη γραμμή που πρόκειται να εκτελεστεί - τίποτα στο πρόγραμμα δεν έχει τρέξει ακόμη. Ο κώδικας κατά τη μεταγλώττιση (BEGIN, use) έχει ήδη τρέξει· η πρώτη προτροπή έρχεται πριν από την πρώτη δήλωση χρόνου εκτέλεσης.
Το DB<1> - ο αριθμός είναι μετρητής εντολών που αυξάνει σε κάθε εντολή. Το !N ανακαλεί την εντολή με αριθμό N. Το DB<<N>> με διπλές αγκύλες σημαίνει ότι βρίσκεστε μέσα σε εμφωλευμένο αποσφαλματωτή (μια έκφραση στην οποία μπήκατε με βηματική εκτέλεση κάλεσε άλλη έκφραση στην οποία μπορεί να σπάσει η εκτέλεση).
Ο αποσφαλματωτής δείχνει πάντα τη γραμμή που πρόκειται να εκτελεστεί, ποτέ τη γραμμή που μόλις εκτελέστηκε.
Έξοδος#
DB<1> q
Όχι quit, όχι exit. Η εγγραφή exit τρέχει την exit της Perl μέσα στην eval του αποσφαλματωτή, που δεν είναι το ίδιο. Το ^D στην προτροπή δουλεύει στα περισσότερα τερματικά.
Βοήθεια#
DB<1> h # one-screen summary
DB<1> h h # full help (long - use the pager)
DB<1> h b # help on one command
DB<1> |h h # pipe full help through $ENV{PAGER}
Πού βρίσκομαι;#
Το v δείχνει ένα παράθυρο γύρω από την τρέχουσα γραμμή. Το l παραθέτει ένα καθορισμένο εύρος:
DB<1> v
1 #!/usr/bin/perl
2 use v5.40;
3
4==> my $key = 'welcome';
5: my %data = (
6 'this' => qw(that),
7 'tom' => qw(and jerry),
8 'welcome' => q(Hello World),
9 'zip' => q(welcome),
10 );
Το
==>σημαίνει την επόμενη γραμμή προς εκτέλεση.Το
:σημαίνει εκτελέσιμες γραμμές - μπορείτε να ορίσετε breakpoint εκεί.Γραμμές χωρίς
:δεν δέχονται διακοπή (σχόλια, κενά, συνέχειες πολυγραμμικής δήλωσης).
Πλοήγηση:
Εντολή | Αποτέλεσμα |
|---|---|
| Προβολή παραθύρου γύρω από την τρέχουσα γραμμή. |
| Προβολή παραθύρου γύρω από τη γραμμή LINE. |
| Παράθεση του επόμενου παραθύρου· η επανάληψη προχωράει. |
| Παράθεση μόνο της γραμμής LINE. |
| Παράθεση εύρους. |
| Παράθεση του πρώτου παραθύρου της SUB. |
| Προηγούμενο παράθυρο. |
| Επαναφορά της προβολής στην τρέχουσα γραμμή. |
| Εναλλαγή της προβολής στο FILE (regex έναντι του |
| Αναζήτηση προς τα εμπρός στον πηγαίο. |
| Αναζήτηση προς τα πίσω. |
Κίνηση: s, n, Enter, c, r#
Οι τέσσερις απαραίτητες εντολές κίνησης:
Εντολή | Αποτέλεσμα |
|---|---|
| Step - εκτέλεση της επόμενης δήλωσης· είσοδος μέσα σε υπορουτίνες. |
| Next - εκτέλεση της επόμενης δήλωσης· πέρασμα πάνω από τις υπορουτίνες. |
| Επανάληψη του τελευταίου |
| Συνέχεια ως το επόμενο breakpoint ή το τέλος. |
| Συνέχεια ως ένα breakpoint μίας χρήσης στη γραμμή LINE, μετά διακοπή. |
| Συνέχεια ως την πρώτη γραμμή της SUB. |
| Επιστροφή από την τρέχουσα sub· διακοπή στον καλούντα. |
DB<1> s # descend into the call
DB<2> n # stay at this level
DB<3> # <Enter> repeats the last motion
DB<4> c 42 # run to line 42 once
DB<5> r # pop the current frame
Μια πολυγραμμική δήλωση εκτελείται ατομικά με ένα βήμα - ένα s εκτελεί ολόκληρη πολυγραμμική ανάθεση κατακερματισμού.
Σε γραμμή που δεν καλεί υπορουτίνες, τα s και n είναι αδιάκριτα μεταξύ τους.
Εκτύπωση τιμών: p και x#
DB<1> p $key
welcome
DB<2> p join ',', sort keys %data
this,tom,welcome,zip
Το p EXPR αποτιμά την EXPR στο τρέχον πακέτο του προγράμματος και εκτυπώνει το αποτέλεσμα σε βαθμωτό περιβάλλον ακολουθούμενο από newline. Το p είναι επίπεδο - για αναφορά εκτυπώνει HASH(0x...), όχι περιεχόμενα.
Για δομές, χρησιμοποιήστε το x:
DB<3> x \%data
0 HASH(0x5651f9a82358)
'this' => 'that'
'tom' => 'and'
'welcome' => 'jerry'
'zip' => 'Hello World'
Πάντα περάστε αναφορά (x \%h, x \@a) - το x %h κάνει dump την επίπεδη λίστα κλειδιού/τιμής, που κρύβει τη δομή.
Δείτε inspecting-state για το πλήρες λεξιλόγιο επιθεώρησης (V, X, y, m, M, i, χειριστήρια βάθους).
Η στοίβα κλήσεων: T, s, r#
Το T εκτυπώνει backtrace - την αλυσίδα κλήσεων sub που οδήγησαν στην τρέχουσα γραμμή:
DB<1> T
$ = main::handle_request(ref(HTTP::Request)) called from file 'app.pl' line 47
$ = main::dispatch('GET', '/users/42') called from file 'app.pl' line 19
@ = main::main() called from file 'app.pl' line 12
$- κλήση σε βαθμωτό περιβάλλον.@- κλήση σε περιβάλλον λίστας..- κενό περιβάλλον.Τα ορίσματα εμφανίζονται με αποκοπή τύπου
Data::Dumper· το ακριβές όριο μήκους είναι η επιλογήmaxTraceLen.
Πλοηγηθείτε στη στοίβα με s (μέσα σε κλήση) και r (έξω από το τρέχον πλαίσιο). Δεν υπάρχει εντολή «frame up / frame down»: επανα-εκτελέστε βήματα αν φτάσετε πολύ βαθιά, ή χρησιμοποιήστε το b για να ορίσετε breakpoint στον καλούντα και c για να το φτάσετε.
Για να επιθεωρήσετε τις λεξιλογικές ενός εξωτερικού πλαισίου, χρησιμοποιήστε το y LEVEL από το inspecting-state - διαβάζει μέσω του PadWalker και δείχνει τις μεταβλητές my της περικλείουσας εμβέλειας.
Αποτίμηση Perl στην προτροπή#
Ό,τι δεν αναγνωρίζει ο αποσφαλματωτής ως εντολή υφίσταται eval ως κώδικας Perl στο πακέτο DB στην τρέχουσα λεξιλογική εμβέλεια:
DB<1> $counter = 0 # mutate state
DB<2> @ARGV = qw(new args) # mutate @ARGV
DB<3> $obj->reset # call a method
DB<4> m/(\w+)/ && p $1 # match against $_
Ένα φρέσκο my $x στην προτροπή εξαφανίζεται όταν η εντολή επιστρέψει - η προτροπή έχει τη δική της λεξιλογική εμβέλεια. Χρησιμοποιήστε bareword, our, ή αλυσιδώστε σε μία γραμμή:
DB<1> our $tmp = compute(); # survives
DB<2> $tmp = compute(); p $tmp # one-line chain
Επιβάλλετε ερμηνεία Perl όταν μια έκφραση μοιάζει με εντολή αποσφαλματωτή:
DB<1> ; h EXPR # ; prefix forces eval
DB<2> + h EXPR # + prefix works too
Επανεκκίνηση και rerun#
Το R επανεκκινεί το πρόγραμμα μέσω exec(). Διατηρούνται ιστορικό, breakpoints, ενέργειες, επιλογές, και η γραμμή εντολών:
DB<1> R
Το rerun επανεκτελεί χωρίς να φύγει από τον αποσφαλματωτή, διατηρώντας κατάσταση:
Μορφή | Αποτέλεσμα |
|---|---|
| Επανεκκίνηση, χωρίς αναπαραγωγή προηγούμενων εντολών. |
| Επανεκκίνηση και αναπαραγωγή ως N εντολές πίσω. |
| Επανεκκίνηση από την εγγραφή N του ιστορικού. |
Επανορισμός sub στη μέση της συνεδρίας#
Επικολλήστε ολόκληρο το sub NAME { ... } στην προτροπή. Ή επεξεργαστείτε αρχείο αντικατάστασης και φορτώστε το:
DB<1> do 'fixed.pl'
Οι μεταγενέστερες κλήσεις χρησιμοποιούν τον νέο ορισμό. Τα υπάρχοντα πλαίσια στοίβας συνεχίζουν με το παλιό σώμα.
Εντολές ως τώρα#
Εντολή | Αποτέλεσμα |
|---|---|
| Βοήθεια: σύνοψη / μία εντολή / πλήρης. |
| Σωλήνωση της εξόδου μέσω του |
| Έξοδος. |
| Προβολή πηγαίου γύρω από την τρέχουσα γραμμή / LINE. |
| Παράθεση. |
| Επαναφορά στην τρέχουσα γραμμή. |
| Προηγούμενο παράθυρο. |
| Εναλλαγή προβολής στο FILE. |
| Αναζήτηση προς τα εμπρός / προς τα πίσω. |
| Step μέσα. |
| Step πάνω από. |
| Επανάληψη τελευταίου |
| Επιστροφή από την τρέχουσα sub. |
| Συνέχεια / breakpoint μίας χρήσης. |
| Print (βαθμωτό περιβάλλον). |
| Dump (δομημένο, περάστε αναφορά). |
| Backtrace στοίβας. |
| Επανεκκίνηση μέσω |
| Επανεκκίνηση με αναπαραγωγή ιστορικού. |
Μάθετε περισσότερα#
breakpoints -
b, υπό συνθήκη, ενέργειες, watches, πίνακας χρονισμού.inspecting-state -
V,X,y,m,M,i, χειριστήρια βάθους.tracing -
t,AutoTrace, έξοδος πληροφορίας γραμμής σε αρχείο.