Ο διαδραστικός αποσφαλματωτής#

Αυτό το κεφάλαιο καλύπτει το perl -d: εκκίνηση προγράμματος υπό τον αποσφαλματωτή, την προτροπή, τις απαραίτητες εντολές κίνησης και επιθεώρησης, και το λεξιλόγιο πλοήγησης στη στοίβα. Μετά από αυτό το κεφάλαιο μπορείτε να διερευνήσετε διαδραστικά οποιοδήποτε εκτελούμενο πρόγραμμα.

Οι αναγνώστες ξεκινούν γνωρίζοντας ότι τα print / warn δουλεύουν αλλά δεν αρκούν: πρέπει να σταματήσετε, να κοιτάξετε γύρω σας, να ρίξετε ματιά σε μεταβλητές, να διασχίσετε τη στοίβα κλήσεων, και μετά να συνεχίσετε. Αυτό προσφέρει αυτό το κεφάλαιο.

Εκκίνηση#

Για οποιοδήποτε σενάριο app.pl, προσθέστε -d μπροστά:

perl -d app.pl --verbose input.txt

Τα ορίσματα μετά το όνομα του σεναρίου περνούν στο σενάριο κανονικά.

Συνηθισμένες μορφές εκκίνησης:

Μορφή

Σκοπός

perl -d script.pl args

Αποσφαλμάτωση του δοθέντος σεναρίου.

perl -d -e 'CODE'

Αποσφαλμάτωση έκφρασης μονογράμμου.

perl -de 0

Διαδραστικό sandbox REPL.

perl -d:Module script.pl

Φόρτωση του Devel::Module ως αποσφαλματωτή.

perl -d:NYTProf script

Προφιλάρισμα μέσω του πρόσθετου NYTProf.

perl -S -d script.pl

Αναζήτηση του $PATH για το σενάριο.

Το -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 εκεί.

  • Γραμμές χωρίς : δεν δέχονται διακοπή (σχόλια, κενά, συνέχειες πολυγραμμικής δήλωσης).

Πλοήγηση:

Εντολή

Αποτέλεσμα

v

Προβολή παραθύρου γύρω από την τρέχουσα γραμμή.

v LINE

Προβολή παραθύρου γύρω από τη γραμμή LINE.

l

Παράθεση του επόμενου παραθύρου· η επανάληψη προχωράει.

l LINE

Παράθεση μόνο της γραμμής LINE.

l MIN-MAX

Παράθεση εύρους.

l SUB

Παράθεση του πρώτου παραθύρου της SUB.

-

Προηγούμενο παράθυρο.

.

Επαναφορά της προβολής στην τρέχουσα γραμμή.

f FILE

Εναλλαγή της προβολής στο FILE (regex έναντι του %INC).

/PAT/

Αναζήτηση προς τα εμπρός στον πηγαίο.

?PAT?

Αναζήτηση προς τα πίσω.

Κίνηση: s, n, Enter, c, r#

Οι τέσσερις απαραίτητες εντολές κίνησης:

Εντολή

Αποτέλεσμα

s

Step - εκτέλεση της επόμενης δήλωσης· είσοδος μέσα σε υπορουτίνες.

n

Next - εκτέλεση της επόμενης δήλωσης· πέρασμα πάνω από τις υπορουτίνες.

<Enter>

Επανάληψη του τελευταίου s ή n.

c

Συνέχεια ως το επόμενο breakpoint ή το τέλος.

c LINE

Συνέχεια ως ένα breakpoint μίας χρήσης στη γραμμή LINE, μετά διακοπή.

c SUB

Συνέχεια ως την πρώτη γραμμή της SUB.

r

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

Μορφή

Αποτέλεσμα

rerun

Επανεκκίνηση, χωρίς αναπαραγωγή προηγούμενων εντολών.

rerun -N

Επανεκκίνηση και αναπαραγωγή ως N εντολές πίσω.

rerun N

Επανεκκίνηση από την εγγραφή N του ιστορικού.

Επανορισμός sub στη μέση της συνεδρίας#

Επικολλήστε ολόκληρο το sub NAME { ... } στην προτροπή. Ή επεξεργαστείτε αρχείο αντικατάστασης και φορτώστε το:

  DB<1> do 'fixed.pl'

Οι μεταγενέστερες κλήσεις χρησιμοποιούν τον νέο ορισμό. Τα υπάρχοντα πλαίσια στοίβας συνεχίζουν με το παλιό σώμα.

Εντολές ως τώρα#

Εντολή

Αποτέλεσμα

h, h CMD, h h

Βοήθεια: σύνοψη / μία εντολή / πλήρης.

|CMD

Σωλήνωση της εξόδου μέσω του $ENV{PAGER}.

q

Έξοδος.

v, v LINE

Προβολή πηγαίου γύρω από την τρέχουσα γραμμή / LINE.

l, l LINE, l SUB, l MIN-MAX

Παράθεση.

.

Επαναφορά στην τρέχουσα γραμμή.

-

Προηγούμενο παράθυρο.

f FILE

Εναλλαγή προβολής στο FILE.

/PAT/, ?PAT?

Αναζήτηση προς τα εμπρός / προς τα πίσω.

s

Step μέσα.

n

Step πάνω από.

<Enter>

Επανάληψη τελευταίου s / n.

r

Επιστροφή από την τρέχουσα sub.

c, c LINE, c SUB

Συνέχεια / breakpoint μίας χρήσης.

p EXPR

Print (βαθμωτό περιβάλλον).

x EXPR

Dump (δομημένο, περάστε αναφορά).

T

Backtrace στοίβας.

R

Επανεκκίνηση μέσω exec().

rerun [N|-N]

Επανεκκίνηση με αναπαραγωγή ιστορικού.

Μάθετε περισσότερα#

  • breakpoints - b, υπό συνθήκη, ενέργειες, watches, πίνακας χρονισμού.

  • inspecting-state - V, X, y, m, M, i, χειριστήρια βάθους.

  • tracing - t, AutoTrace, έξοδος πληροφορίας γραμμής σε αρχείο.