1 2=head1 NAME 3 4perl5db.pl - the perl debugger 5 6=head1 SYNOPSIS 7 8 perl -d your_Perl_script 9 10=head1 DESCRIPTION 11 12C<perl5db.pl> is the perl debugger. It is loaded automatically by Perl when 13you invoke a script with C<perl -d>. This documentation tries to outline the 14structure and services provided by C<perl5db.pl>, and to describe how you 15can use them. 16 17=head1 GENERAL NOTES 18 19The debugger can look pretty forbidding to many Perl programmers. There are 20a number of reasons for this, many stemming out of the debugger's history. 21 22When the debugger was first written, Perl didn't have a lot of its nicer 23features - no references, no lexical variables, no closures, no object-oriented 24programming. So a lot of the things one would normally have done using such 25features was done using global variables, globs and the C<local()> operator 26in creative ways. 27 28Some of these have survived into the current debugger; a few of the more 29interesting and still-useful idioms are noted in this section, along with notes 30on the comments themselves. 31 32=head2 Why not use more lexicals? 33 34Experienced Perl programmers will note that the debugger code tends to use 35mostly package globals rather than lexically-scoped variables. This is done 36to allow a significant amount of control of the debugger from outside the 37debugger itself. 38 39Unfortunately, though the variables are accessible, they're not well 40documented, so it's generally been a decision that hasn't made a lot of 41difference to most users. Where appropriate, comments have been added to 42make variables more accessible and usable, with the understanding that these 43I<are> debugger internals, and are therefore subject to change. Future 44development should probably attempt to replace the globals with a well-defined 45API, but for now, the variables are what we've got. 46 47=head2 Automated variable stacking via C<local()> 48 49As you may recall from reading C<perlfunc>, the C<local()> operator makes a 50temporary copy of a variable in the current scope. When the scope ends, the 51old copy is restored. This is often used in the debugger to handle the 52automatic stacking of variables during recursive calls: 53 54 sub foo { 55 local $some_global++; 56 57 # Do some stuff, then ... 58 return; 59 } 60 61What happens is that on entry to the subroutine, C<$some_global> is localized, 62then altered. When the subroutine returns, Perl automatically undoes the 63localization, restoring the previous value. Voila, automatic stack management. 64 65The debugger uses this trick a I<lot>. Of particular note is C<DB::eval>, 66which lets the debugger get control inside of C<eval>'ed code. The debugger 67localizes a saved copy of C<$@> inside the subroutine, which allows it to 68keep C<$@> safe until it C<DB::eval> returns, at which point the previous 69value of C<$@> is restored. This makes it simple (well, I<simpler>) to keep 70track of C<$@> inside C<eval>s which C<eval> other C<eval's>. 71 72In any case, watch for this pattern. It occurs fairly often. 73 74=head2 The C<^> trick 75 76This is used to cleverly reverse the sense of a logical test depending on 77the value of an auxiliary variable. For instance, the debugger's C<S> 78(search for subroutines by pattern) allows you to negate the pattern 79like this: 80 81 # Find all non-'foo' subs: 82 S !/foo/ 83 84Boolean algebra states that the truth table for XOR looks like this: 85 86=over 4 87 88=item * 0 ^ 0 = 0 89 90(! not present and no match) --> false, don't print 91 92=item * 0 ^ 1 = 1 93 94(! not present and matches) --> true, print 95 96=item * 1 ^ 0 = 1 97 98(! present and no match) --> true, print 99 100=item * 1 ^ 1 = 0 101 102(! present and matches) --> false, don't print 103 104=back 105 106As you can see, the first pair applies when C<!> isn't supplied, and 107the second pair applies when it is. The XOR simply allows us to 108compact a more complicated if-then-elseif-else into a more elegant 109(but perhaps overly clever) single test. After all, it needed this 110explanation... 111 112=head2 FLAGS, FLAGS, FLAGS 113 114There is a certain C programming legacy in the debugger. Some variables, 115such as C<$single>, C<$trace>, and C<$frame>, have I<magical> values composed 116of 1, 2, 4, etc. (powers of 2) OR'ed together. This allows several pieces 117of state to be stored independently in a single scalar. 118 119A test like 120 121 if ($scalar & 4) ... 122 123is checking to see if the appropriate bit is on. Since each bit can be 124"addressed" independently in this way, C<$scalar> is acting sort of like 125an array of bits. Obviously, since the contents of C<$scalar> are just a 126bit-pattern, we can save and restore it easily (it will just look like 127a number). 128 129The problem, is of course, that this tends to leave magic numbers scattered 130all over your program whenever a bit is set, cleared, or checked. So why do 131it? 132 133=over 4 134 135=item * 136 137First, doing an arithmetical or bitwise operation on a scalar is 138just about the fastest thing you can do in Perl: C<use constant> actually 139creates a subroutine call, and array and hash lookups are much slower. Is 140this over-optimization at the expense of readability? Possibly, but the 141debugger accesses these variables a I<lot>. Any rewrite of the code will 142probably have to benchmark alternate implementations and see which is the 143best balance of readability and speed, and then document how it actually 144works. 145 146=item * 147 148Second, it's very easy to serialize a scalar number. This is done in 149the restart code; the debugger state variables are saved in C<%ENV> and then 150restored when the debugger is restarted. Having them be just numbers makes 151this trivial. 152 153=item * 154 155Third, some of these variables are being shared with the Perl core 156smack in the middle of the interpreter's execution loop. It's much faster for 157a C program (like the interpreter) to check a bit in a scalar than to access 158several different variables (or a Perl array). 159 160=back 161 162=head2 What are those C<XXX> comments for? 163 164Any comment containing C<XXX> means that the comment is either somewhat 165speculative - it's not exactly clear what a given variable or chunk of 166code is doing, or that it is incomplete - the basics may be clear, but the 167subtleties are not completely documented. 168 169Send in a patch if you can clear up, fill out, or clarify an C<XXX>. 170 171=head1 DATA STRUCTURES MAINTAINED BY CORE 172 173There are a number of special data structures provided to the debugger by 174the Perl interpreter. 175 176The array C<@{$main::{'_<'.$filename}}> (aliased locally to C<@dbline> 177via glob assignment) contains the text from C<$filename>, with each 178element corresponding to a single line of C<$filename>. Additionally, 179breakable lines will be dualvars with the numeric component being the 180memory address of a COP node. Non-breakable lines are dualvar to 0. 181 182The hash C<%{'_<'.$filename}> (aliased locally to C<%dbline> via glob 183assignment) contains breakpoints and actions. The keys are line numbers; 184you can set individual values, but not the whole hash. The Perl interpreter 185uses this hash to determine where breakpoints have been set. Any true value is 186considered to be a breakpoint; C<perl5db.pl> uses C<$break_condition\0$action>. 187Values are magical in numeric context: 1 if the line is breakable, 0 if not. 188 189The scalar C<${"_<$filename"}> simply contains the string C<$filename>. 190This is also the case for evaluated strings that contain subroutines, or 191which are currently being executed. The $filename for C<eval>ed strings looks 192like C<(eval 34)>. 193 194=head1 DEBUGGER STARTUP 195 196When C<perl5db.pl> starts, it reads an rcfile (C<perl5db.ini> for 197non-interactive sessions, C<.perldb> for interactive ones) that can set a number 198of options. In addition, this file may define a subroutine C<&afterinit> 199that will be executed (in the debugger's context) after the debugger has 200initialized itself. 201 202Next, it checks the C<PERLDB_OPTS> environment variable and treats its 203contents as the argument of a C<o> command in the debugger. 204 205=head2 STARTUP-ONLY OPTIONS 206 207The following options can only be specified at startup. 208To set them in your rcfile, add a call to 209C<&parse_options("optionName=new_value")>. 210 211=over 4 212 213=item * TTY 214 215the TTY to use for debugging i/o. 216 217=item * noTTY 218 219if set, goes in NonStop mode. On interrupt, if TTY is not set, 220uses the value of noTTY or F<$HOME/.perldbtty$$> to find TTY using 221Term::Rendezvous. Current variant is to have the name of TTY in this 222file. 223 224=item * ReadLine 225 226if false, a dummy ReadLine is used, so you can debug 227ReadLine applications. 228 229=item * NonStop 230 231if true, no i/o is performed until interrupt. 232 233=item * LineInfo 234 235file or pipe to print line number info to. If it is a 236pipe, a short "emacs like" message is used. 237 238=item * RemotePort 239 240host:port to connect to on remote host for remote debugging. 241 242=item * HistFile 243 244file to store session history to. There is no default and so no 245history file is written unless this variable is explicitly set. 246 247=item * HistSize 248 249number of commands to store to the file specified in C<HistFile>. 250Default is 100. 251 252=back 253 254=head3 SAMPLE RCFILE 255 256 &parse_options("NonStop=1 LineInfo=db.out"); 257 sub afterinit { $trace = 1; } 258 259The script will run without human intervention, putting trace 260information into C<db.out>. (If you interrupt it, you had better 261reset C<LineInfo> to something I<interactive>!) 262 263=head1 INTERNALS DESCRIPTION 264 265=head2 DEBUGGER INTERFACE VARIABLES 266 267Perl supplies the values for C<%sub>. It effectively inserts 268a C<&DB::DB();> in front of each place that can have a 269breakpoint. At each subroutine call, it calls C<&DB::sub> with 270C<$DB::sub> set to the called subroutine. It also inserts a C<BEGIN 271{require 'perl5db.pl'}> before the first line. 272 273After each C<require>d file is compiled, but before it is executed, a 274call to C<&DB::postponed($main::{'_<'.$filename})> is done. C<$filename> 275is the expanded name of the C<require>d file (as found via C<%INC>). 276 277=head3 IMPORTANT INTERNAL VARIABLES 278 279=head4 C<$CreateTTY> 280 281Used to control when the debugger will attempt to acquire another TTY to be 282used for input. 283 284=over 285 286=item * 1 - on C<fork()> 287 288=item * 2 - debugger is started inside debugger 289 290=item * 4 - on startup 291 292=back 293 294=head4 C<$doret> 295 296The value -2 indicates that no return value should be printed. 297Any other positive value causes C<DB::sub> to print return values. 298 299=head4 C<$evalarg> 300 301The item to be eval'ed by C<DB::eval>. Used to prevent messing with the current 302contents of C<@_> when C<DB::eval> is called. 303 304=head4 C<$frame> 305 306Determines what messages (if any) will get printed when a subroutine (or eval) 307is entered or exited. 308 309=over 4 310 311=item * 0 - No enter/exit messages 312 313=item * 1 - Print I<entering> messages on subroutine entry 314 315=item * 2 - Adds exit messages on subroutine exit. If no other flag is on, acts like 1+2. 316 317=item * 4 - Extended messages: C<< <in|out> I<context>=I<fully-qualified sub name> from I<file>:I<line> >>. If no other flag is on, acts like 1+4. 318 319=item * 8 - Adds parameter information to messages, and overloaded stringify and tied FETCH is enabled on the printed arguments. Ignored if C<4> is not on. 320 321=item * 16 - Adds C<I<context> return from I<subname>: I<value>> messages on subroutine/eval exit. Ignored if C<4> is not on. 322 323=back 324 325To get everything, use C<$frame=30> (or C<o f=30> as a debugger command). 326The debugger internally juggles the value of C<$frame> during execution to 327protect external modules that the debugger uses from getting traced. 328 329=head4 C<$level> 330 331Tracks current debugger nesting level. Used to figure out how many 332C<E<lt>E<gt>> pairs to surround the line number with when the debugger 333outputs a prompt. Also used to help determine if the program has finished 334during command parsing. 335 336=head4 C<$onetimeDump> 337 338Controls what (if anything) C<DB::eval()> will print after evaluating an 339expression. 340 341=over 4 342 343=item * C<undef> - don't print anything 344 345=item * C<dump> - use C<dumpvar.pl> to display the value returned 346 347=item * C<methods> - print the methods callable on the first item returned 348 349=back 350 351=head4 C<$onetimeDumpDepth> 352 353Controls how far down C<dumpvar.pl> will go before printing C<...> while 354dumping a structure. Numeric. If C<undef>, print all levels. 355 356=head4 C<$signal> 357 358Used to track whether or not an C<INT> signal has been detected. C<DB::DB()>, 359which is called before every statement, checks this and puts the user into 360command mode if it finds C<$signal> set to a true value. 361 362=head4 C<$single> 363 364Controls behavior during single-stepping. Stacked in C<@stack> on entry to 365each subroutine; popped again at the end of each subroutine. 366 367=over 4 368 369=item * 0 - run continuously. 370 371=item * 1 - single-step, go into subs. The C<s> command. 372 373=item * 2 - single-step, don't go into subs. The C<n> command. 374 375=item * 4 - print current sub depth (turned on to force this when C<too much 376recursion> occurs. 377 378=back 379 380=head4 C<$trace> 381 382Controls the output of trace information. 383 384=over 4 385 386=item * 1 - The C<t> command was entered to turn on tracing (every line executed is printed) 387 388=item * 2 - watch expressions are active 389 390=item * 4 - user defined a C<watchfunction()> in C<afterinit()> 391 392=back 393 394=head4 C<$slave_editor> 395 3961 if C<LINEINFO> was directed to a pipe; 0 otherwise. 397 398=head4 C<@cmdfhs> 399 400Stack of filehandles that C<DB::readline()> will read commands from. 401Manipulated by the debugger's C<source> command and C<DB::readline()> itself. 402 403=head4 C<@dbline> 404 405Local alias to the magical line array, C<@{$main::{'_<'.$filename}}> , 406supplied by the Perl interpreter to the debugger. Contains the source. 407 408=head4 C<@old_watch> 409 410Previous values of watch expressions. First set when the expression is 411entered; reset whenever the watch expression changes. 412 413=head4 C<@saved> 414 415Saves important globals (C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W>) 416so that the debugger can substitute safe values while it's running, and 417restore them when it returns control. 418 419=head4 C<@stack> 420 421Saves the current value of C<$single> on entry to a subroutine. 422Manipulated by the C<c> command to turn off tracing in all subs above the 423current one. 424 425=head4 C<@to_watch> 426 427The 'watch' expressions: to be evaluated before each line is executed. 428 429=head4 C<@typeahead> 430 431The typeahead buffer, used by C<DB::readline>. 432 433=head4 C<%alias> 434 435Command aliases. Stored as character strings to be substituted for a command 436entered. 437 438=head4 C<%break_on_load> 439 440Keys are file names, values are 1 (break when this file is loaded) or undef 441(don't break when it is loaded). 442 443=head4 C<%dbline> 444 445Keys are line numbers, values are C<condition\0action>. If used in numeric 446context, values are 0 if not breakable, 1 if breakable, no matter what is 447in the actual hash entry. 448 449=head4 C<%had_breakpoints> 450 451Keys are file names; values are bitfields: 452 453=over 4 454 455=item * 1 - file has a breakpoint in it. 456 457=item * 2 - file has an action in it. 458 459=back 460 461A zero or undefined value means this file has neither. 462 463=head4 C<%option> 464 465Stores the debugger options. These are character string values. 466 467=head4 C<%postponed> 468 469Saves breakpoints for code that hasn't been compiled yet. 470Keys are subroutine names, values are: 471 472=over 4 473 474=item * C<compile> - break when this sub is compiled 475 476=item * C<< break +0 if <condition> >> - break (conditionally) at the start of this routine. The condition will be '1' if no condition was specified. 477 478=back 479 480=head4 C<%postponed_file> 481 482This hash keeps track of breakpoints that need to be set for files that have 483not yet been compiled. Keys are filenames; values are references to hashes. 484Each of these hashes is keyed by line number, and its values are breakpoint 485definitions (C<condition\0action>). 486 487=head1 DEBUGGER INITIALIZATION 488 489The debugger's initialization actually jumps all over the place inside this 490package. This is because there are several BEGIN blocks (which of course 491execute immediately) spread through the code. Why is that? 492 493The debugger needs to be able to change some things and set some things up 494before the debugger code is compiled; most notably, the C<$deep> variable that 495C<DB::sub> uses to tell when a program has recursed deeply. In addition, the 496debugger has to turn off warnings while the debugger code is compiled, but then 497restore them to their original setting before the program being debugged begins 498executing. 499 500The first C<BEGIN> block simply turns off warnings by saving the current 501setting of C<$^W> and then setting it to zero. The second one initializes 502the debugger variables that are needed before the debugger begins executing. 503The third one puts C<$^X> back to its former value. 504 505We'll detail the second C<BEGIN> block later; just remember that if you need 506to initialize something before the debugger starts really executing, that's 507where it has to go. 508 509=cut 510 511package DB; 512 513use strict; 514 515use Cwd (); 516 517my $_initial_cwd; 518 519BEGIN {eval 'use IO::Handle'}; # Needed for flush only? breaks under miniperl 520 521BEGIN { 522 require feature; 523 $^V =~ /^v(\d+\.\d+)/; 524 feature->import(":$1"); 525 $_initial_cwd = Cwd::getcwd(); 526} 527 528# Debugger for Perl 5.00x; perl5db.pl patch level: 529use vars qw($VERSION $header); 530 531# bump to X.XX in blead, only use X.XX_XX in maint 532$VERSION = '1.57'; 533 534$header = "perl5db.pl version $VERSION"; 535 536=head1 DEBUGGER ROUTINES 537 538=head2 C<DB::eval()> 539 540This function replaces straight C<eval()> inside the debugger; it simplifies 541the process of evaluating code in the user's context. 542 543The code to be evaluated is passed via the package global variable 544C<$DB::evalarg>; this is done to avoid fiddling with the contents of C<@_>. 545 546Before we do the C<eval()>, we preserve the current settings of C<$trace>, 547C<$single>, C<$^D> and C<$usercontext>. The latter contains the 548preserved values of C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W> and the 549user's current package, grabbed when C<DB::DB> got control. This causes the 550proper context to be used when the eval is actually done. Afterward, we 551restore C<$trace>, C<$single>, and C<$^D>. 552 553Next we need to handle C<$@> without getting confused. We save C<$@> in a 554local lexical, localize C<$saved[0]> (which is where C<save()> will put 555C<$@>), and then call C<save()> to capture C<$@>, C<$!>, C<$^E>, C<$,>, 556C<$/>, C<$\>, and C<$^W>) and set C<$,>, C<$/>, C<$\>, and C<$^W> to values 557considered sane by the debugger. If there was an C<eval()> error, we print 558it on the debugger's output. If C<$onetimedump> is defined, we call 559C<dumpit> if it's set to 'dump', or C<methods> if it's set to 560'methods'. Setting it to something else causes the debugger to do the eval 561but not print the result - handy if you want to do something else with it 562(the "watch expressions" code does this to get the value of the watch 563expression but not show it unless it matters). 564 565In any case, we then return the list of output from C<eval> to the caller, 566and unwinding restores the former version of C<$@> in C<@saved> as well 567(the localization of C<$saved[0]> goes away at the end of this scope). 568 569=head3 Parameters and variables influencing execution of DB::eval() 570 571C<DB::eval> isn't parameterized in the standard way; this is to keep the 572debugger's calls to C<DB::eval()> from mucking with C<@_>, among other things. 573The variables listed below influence C<DB::eval()>'s execution directly. 574 575=over 4 576 577=item C<$evalarg> - the thing to actually be eval'ed 578 579=item C<$trace> - Current state of execution tracing 580 581=item C<$single> - Current state of single-stepping 582 583=item C<$onetimeDump> - what is to be displayed after the evaluation 584 585=item C<$onetimeDumpDepth> - how deep C<dumpit()> should go when dumping results 586 587=back 588 589The following variables are altered by C<DB::eval()> during its execution. They 590are "stacked" via C<local()>, enabling recursive calls to C<DB::eval()>. 591 592=over 4 593 594=item C<@res> - used to capture output from actual C<eval>. 595 596=item C<$otrace> - saved value of C<$trace>. 597 598=item C<$osingle> - saved value of C<$single>. 599 600=item C<$od> - saved value of C<$^D>. 601 602=item C<$saved[0]> - saved value of C<$@>. 603 604=item $\ - for output of C<$@> if there is an evaluation error. 605 606=back 607 608=head3 The problem of lexicals 609 610The context of C<DB::eval()> presents us with some problems. Obviously, 611we want to be 'sandboxed' away from the debugger's internals when we do 612the eval, but we need some way to control how punctuation variables and 613debugger globals are used. 614 615We can't use local, because the code inside C<DB::eval> can see localized 616variables; and we can't use C<my> either for the same reason. The code 617in this routine compromises and uses C<my>. 618 619After this routine is over, we don't have user code executing in the debugger's 620context, so we can use C<my> freely. 621 622=cut 623 624############################################## Begin lexical danger zone 625 626# 'my' variables used here could leak into (that is, be visible in) 627# the context that the code being evaluated is executing in. This means that 628# the code could modify the debugger's variables. 629# 630# Fiddling with the debugger's context could be Bad. We insulate things as 631# much as we can. 632 633use vars qw( 634 @args 635 %break_on_load 636 $CommandSet 637 $CreateTTY 638 $DBGR 639 @dbline 640 $dbline 641 %dbline 642 $dieLevel 643 $filename 644 $histfile 645 $histsize 646 $IN 647 $inhibit_exit 648 @ini_INC 649 $ini_warn 650 $maxtrace 651 $od 652 @options 653 $osingle 654 $otrace 655 $pager 656 $post 657 %postponed 658 $prc 659 $pre 660 $pretype 661 $psh 662 @RememberOnROptions 663 $remoteport 664 @res 665 $rl 666 @saved 667 $signalLevel 668 $sub 669 $term 670 $usercontext 671 $warnLevel 672); 673 674our ( 675 @cmdfhs, 676 $evalarg, 677 $frame, 678 $hist, 679 $ImmediateStop, 680 $line, 681 $onetimeDump, 682 $onetimedumpDepth, 683 %option, 684 $OUT, 685 $packname, 686 $signal, 687 $single, 688 $start, 689 %sub, 690 $subname, 691 $trace, 692 $window, 693); 694 695# Used to save @ARGV and extract any debugger-related flags. 696use vars qw(@ARGS); 697 698# Used to prevent multiple entries to diesignal() 699# (if for instance diesignal() itself dies) 700use vars qw($panic); 701 702# Used to prevent the debugger from running nonstop 703# after a restart 704our ($second_time); 705 706sub _calc_usercontext { 707 my ($package) = @_; 708 709 # Cancel strict completely for the evaluated code, so the code 710 # the user evaluates won't be affected by it. (Shlomi Fish) 711 return 'no strict; ($@, $!, $^E, $,, $/, $\, $^W) = @DB::saved;' 712 . "package $package;"; # this won't let them modify, alas 713} 714 715sub eval { 716 717 # 'my' would make it visible from user code 718 # but so does local! --tchrist 719 # Remember: this localizes @DB::res, not @main::res. 720 local @res; 721 { 722 723 # Try to keep the user code from messing with us. Save these so that 724 # even if the eval'ed code changes them, we can put them back again. 725 # Needed because the user could refer directly to the debugger's 726 # package globals (and any 'my' variables in this containing scope) 727 # inside the eval(), and we want to try to stay safe. 728 local $otrace = $trace; 729 local $osingle = $single; 730 local $od = $^D; 731 732 # Untaint the incoming eval() argument. 733 { ($evalarg) = $evalarg =~ /(.*)/s; } 734 735 # $usercontext built in DB::DB near the comment 736 # "set up the context for DB::eval ..." 737 # Evaluate and save any results. 738 @res = eval "$usercontext $evalarg;\n"; # '\n' for nice recursive debug 739 740 # Restore those old values. 741 $trace = $otrace; 742 $single = $osingle; 743 $^D = $od; 744 } 745 746 # Save the current value of $@, and preserve it in the debugger's copy 747 # of the saved precious globals. 748 my $at = $@; 749 750 # Since we're only saving $@, we only have to localize the array element 751 # that it will be stored in. 752 local $saved[0]; # Preserve the old value of $@ 753 eval { &DB::save }; 754 755 # Now see whether we need to report an error back to the user. 756 if ($at) { 757 local $\ = ''; 758 print $OUT $at; 759 } 760 761 # Display as required by the caller. $onetimeDump and $onetimedumpDepth 762 # are package globals. 763 elsif ($onetimeDump) { 764 if ( $onetimeDump eq 'dump' ) { 765 local $option{dumpDepth} = $onetimedumpDepth 766 if defined $onetimedumpDepth; 767 dumpit( $OUT, \@res ); 768 } 769 elsif ( $onetimeDump eq 'methods' ) { 770 methods( $res[0] ); 771 } 772 } ## end elsif ($onetimeDump) 773 @res; 774} ## end sub eval 775 776############################################## End lexical danger zone 777 778# After this point it is safe to introduce lexicals. 779# The code being debugged will be executing in its own context, and 780# can't see the inside of the debugger. 781# 782# However, one should not overdo it: leave as much control from outside as 783# possible. If you make something a lexical, it's not going to be addressable 784# from outside the debugger even if you know its name. 785 786# This file is automatically included if you do perl -d. 787# It's probably not useful to include this yourself. 788# 789# Before venturing further into these twisty passages, it is 790# wise to read the perldebguts man page or risk the ire of dragons. 791# 792# (It should be noted that perldebguts will tell you a lot about 793# the underlying mechanics of how the debugger interfaces into the 794# Perl interpreter, but not a lot about the debugger itself. The new 795# comments in this code try to address this problem.) 796 797# Note that no subroutine call is possible until &DB::sub is defined 798# (for subroutines defined outside of the package DB). In fact the same is 799# true if $deep is not defined. 800 801# Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich) 802 803# modified Perl debugger, to be run from Emacs in perldb-mode 804# Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990 805# Johan Vromans -- upgrade to 4.0 pl 10 806# Ilya Zakharevich -- patches after 5.001 (and some before ;-) 807######################################################################## 808 809=head1 DEBUGGER INITIALIZATION 810 811The debugger starts up in phases. 812 813=head2 BASIC SETUP 814 815First, it initializes the environment it wants to run in: turning off 816warnings during its own compilation, defining variables which it will need 817to avoid warnings later, setting itself up to not exit when the program 818terminates, and defaulting to printing return values for the C<r> command. 819 820=cut 821 822# Needed for the statement after exec(): 823# 824# This BEGIN block is simply used to switch off warnings during debugger 825# compilation. Probably it would be better practice to fix the warnings, 826# but this is how it's done at the moment. 827 828BEGIN { 829 $ini_warn = $^W; 830 $^W = 0; 831} # Switch compilation warnings off until another BEGIN. 832 833local ($^W) = 0; # Switch run-time warnings off during init. 834 835=head2 THREADS SUPPORT 836 837If we are running under a threaded Perl, we require threads and threads::shared 838if the environment variable C<PERL5DB_THREADED> is set, to enable proper 839threaded debugger control. C<-dt> can also be used to set this. 840 841Each new thread will be announced and the debugger prompt will always inform 842you of each new thread created. It will also indicate the thread id in which 843we are currently running within the prompt like this: 844 845 [tid] DB<$i> 846 847Where C<[tid]> is an integer thread id and C<$i> is the familiar debugger 848command prompt. The prompt will show: C<[0]> when running under threads, but 849not actually in a thread. C<[tid]> is consistent with C<gdb> usage. 850 851While running under threads, when you set or delete a breakpoint (etc.), this 852will apply to all threads, not just the currently running one. When you are 853in a currently executing thread, you will stay there until it completes. With 854the current implementation it is not currently possible to hop from one thread 855to another. 856 857The C<e> and C<E> commands are currently fairly minimal - see C<h e> and C<h E>. 858 859Note that threading support was built into the debugger as of Perl version 860C<5.8.6> and debugger version C<1.2.8>. 861 862=cut 863 864BEGIN { 865 # ensure we can share our non-threaded variables or no-op 866 if ($ENV{PERL5DB_THREADED}) { 867 require threads; 868 require threads::shared; 869 import threads::shared qw(share); 870 $DBGR; 871 share(\$DBGR); 872 lock($DBGR); 873 print "Threads support enabled\n"; 874 } else { 875 *lock = sub(*) {}; 876 *share = sub(\[$@%]) {}; 877 } 878} 879 880# These variables control the execution of 'dumpvar.pl'. 881{ 882 package dumpvar; 883 use vars qw( 884 $hashDepth 885 $arrayDepth 886 $dumpDBFiles 887 $dumpPackages 888 $quoteHighBit 889 $printUndef 890 $globPrint 891 $usageOnly 892 ); 893} 894 895# used to control die() reporting in diesignal() 896{ 897 package Carp; 898 use vars qw($CarpLevel); 899} 900 901# without threads, $filename is not defined until DB::DB is called 902share($main::{'_<'.$filename}) if defined $filename; 903 904# Command-line + PERLLIB: 905# Save the contents of @INC before they are modified elsewhere. 906@ini_INC = @INC; 907 908# This was an attempt to clear out the previous values of various 909# trapped errors. Apparently it didn't help. XXX More info needed! 910# $prevwarn = $prevdie = $prevbus = $prevsegv = ''; # Does not help?! 911 912# We set these variables to safe values. We don't want to blindly turn 913# off warnings, because other packages may still want them. 914$trace = $signal = $single = 0; # Uninitialized warning suppression 915 # (local $^W cannot help - other packages!). 916 917# Default to not exiting when program finishes; print the return 918# value when the 'r' command is used to return from a subroutine. 919$inhibit_exit = $option{PrintRet} = 1; 920 921use vars qw($trace_to_depth); 922 923# Default to 1E9 so it won't be limited to a certain recursion depth. 924$trace_to_depth = 1E9; 925 926=head1 OPTION PROCESSING 927 928The debugger's options are actually spread out over the debugger itself and 929C<dumpvar.pl>; some of these are variables to be set, while others are 930subs to be called with a value. To try to make this a little easier to 931manage, the debugger uses a few data structures to define what options 932are legal and how they are to be processed. 933 934First, the C<@options> array defines the I<names> of all the options that 935are to be accepted. 936 937=cut 938 939@options = qw( 940 CommandSet HistFile HistSize 941 hashDepth arrayDepth dumpDepth 942 DumpDBFiles DumpPackages DumpReused 943 compactDump veryCompact quote 944 HighBit undefPrint globPrint 945 PrintRet UsageOnly frame 946 AutoTrace TTY noTTY 947 ReadLine NonStop LineInfo 948 maxTraceLen recallCommand ShellBang 949 pager tkRunning ornaments 950 signalLevel warnLevel dieLevel 951 inhibit_exit ImmediateStop bareStringify 952 CreateTTY RemotePort windowSize 953 DollarCaretP 954); 955 956@RememberOnROptions = qw(DollarCaretP); 957 958=pod 959 960Second, C<optionVars> lists the variables that each option uses to save its 961state. 962 963=cut 964 965use vars qw(%optionVars); 966 967%optionVars = ( 968 hashDepth => \$dumpvar::hashDepth, 969 arrayDepth => \$dumpvar::arrayDepth, 970 CommandSet => \$CommandSet, 971 DumpDBFiles => \$dumpvar::dumpDBFiles, 972 DumpPackages => \$dumpvar::dumpPackages, 973 DumpReused => \$dumpvar::dumpReused, 974 HighBit => \$dumpvar::quoteHighBit, 975 undefPrint => \$dumpvar::printUndef, 976 globPrint => \$dumpvar::globPrint, 977 UsageOnly => \$dumpvar::usageOnly, 978 CreateTTY => \$CreateTTY, 979 bareStringify => \$dumpvar::bareStringify, 980 frame => \$frame, 981 AutoTrace => \$trace, 982 inhibit_exit => \$inhibit_exit, 983 maxTraceLen => \$maxtrace, 984 ImmediateStop => \$ImmediateStop, 985 RemotePort => \$remoteport, 986 windowSize => \$window, 987 HistFile => \$histfile, 988 HistSize => \$histsize, 989); 990 991=pod 992 993Third, C<%optionAction> defines the subroutine to be called to process each 994option. 995 996=cut 997 998use vars qw(%optionAction); 999 1000%optionAction = ( 1001 compactDump => \&dumpvar::compactDump, 1002 veryCompact => \&dumpvar::veryCompact, 1003 quote => \&dumpvar::quote, 1004 TTY => \&TTY, 1005 noTTY => \&noTTY, 1006 ReadLine => \&ReadLine, 1007 NonStop => \&NonStop, 1008 LineInfo => \&LineInfo, 1009 recallCommand => \&recallCommand, 1010 ShellBang => \&shellBang, 1011 pager => \&pager, 1012 signalLevel => \&signalLevel, 1013 warnLevel => \&warnLevel, 1014 dieLevel => \&dieLevel, 1015 tkRunning => \&tkRunning, 1016 ornaments => \&ornaments, 1017 RemotePort => \&RemotePort, 1018 DollarCaretP => \&DollarCaretP, 1019); 1020 1021=pod 1022 1023Last, the C<%optionRequire> notes modules that must be C<require>d if an 1024option is used. 1025 1026=cut 1027 1028# Note that this list is not complete: several options not listed here 1029# actually require that dumpvar.pl be loaded for them to work, but are 1030# not in the table. A subsequent patch will correct this problem; for 1031# the moment, we're just recommenting, and we are NOT going to change 1032# function. 1033use vars qw(%optionRequire); 1034 1035%optionRequire = ( 1036 compactDump => 'dumpvar.pl', 1037 veryCompact => 'dumpvar.pl', 1038 quote => 'dumpvar.pl', 1039); 1040 1041=pod 1042 1043There are a number of initialization-related variables which can be set 1044by putting code to set them in a BEGIN block in the C<PERL5DB> environment 1045variable. These are: 1046 1047=over 4 1048 1049=item C<$rl> - readline control XXX needs more explanation 1050 1051=item C<$warnLevel> - whether or not debugger takes over warning handling 1052 1053=item C<$dieLevel> - whether or not debugger takes over die handling 1054 1055=item C<$signalLevel> - whether or not debugger takes over signal handling 1056 1057=item C<$pre> - preprompt actions (array reference) 1058 1059=item C<$post> - postprompt actions (array reference) 1060 1061=item C<$pretype> 1062 1063=item C<$CreateTTY> - whether or not to create a new TTY for this debugger 1064 1065=item C<$CommandSet> - which command set to use (defaults to new, documented set) 1066 1067=back 1068 1069=cut 1070 1071# These guys may be defined in $ENV{PERL5DB} : 1072$rl = 1 unless defined $rl; 1073$warnLevel = 1 unless defined $warnLevel; 1074$dieLevel = 1 unless defined $dieLevel; 1075$signalLevel = 1 unless defined $signalLevel; 1076$pre = [] unless defined $pre; 1077$post = [] unless defined $post; 1078$pretype = [] unless defined $pretype; 1079$CreateTTY = 3 unless defined $CreateTTY; 1080$CommandSet = '580' unless defined $CommandSet; 1081 1082share($rl); 1083share($warnLevel); 1084share($dieLevel); 1085share($signalLevel); 1086share($pre); 1087share($post); 1088share($pretype); 1089share($rl); 1090share($CreateTTY); 1091share($CommandSet); 1092 1093=pod 1094 1095The default C<die>, C<warn>, and C<signal> handlers are set up. 1096 1097=cut 1098 1099warnLevel($warnLevel); 1100dieLevel($dieLevel); 1101signalLevel($signalLevel); 1102 1103=pod 1104 1105The pager to be used is needed next. We try to get it from the 1106environment first. If it's not defined there, we try to find it in 1107the Perl C<Config.pm>. If it's not there, we default to C<more>. We 1108then call the C<pager()> function to save the pager name. 1109 1110=cut 1111 1112# This routine makes sure $pager is set up so that '|' can use it. 1113pager( 1114 1115 # If PAGER is defined in the environment, use it. 1116 defined $ENV{PAGER} 1117 ? $ENV{PAGER} 1118 1119 # If not, see if Config.pm defines it. 1120 : eval { require Config } 1121 && defined $Config::Config{pager} 1122 ? $Config::Config{pager} 1123 1124 # If not, fall back to 'more'. 1125 : 'more' 1126 ) 1127 unless defined $pager; 1128 1129=pod 1130 1131We set up the command to be used to access the man pages, the command 1132recall character (C<!> unless otherwise defined) and the shell escape 1133character (C<!> unless otherwise defined). Yes, these do conflict, and 1134neither works in the debugger at the moment. 1135 1136=cut 1137 1138setman(); 1139 1140# Set up defaults for command recall and shell escape (note: 1141# these currently don't work in linemode debugging). 1142recallCommand("!") unless defined $prc; 1143shellBang("!") unless defined $psh; 1144 1145=pod 1146 1147We then set up the gigantic string containing the debugger help. 1148We also set the limit on the number of arguments we'll display during a 1149trace. 1150 1151=cut 1152 1153sethelp(); 1154 1155# If we didn't get a default for the length of eval/stack trace args, 1156# set it here. 1157$maxtrace = 400 unless defined $maxtrace; 1158 1159=head2 SETTING UP THE DEBUGGER GREETING 1160 1161The debugger I<greeting> helps to inform the user how many debuggers are 1162running, and whether the current debugger is the primary or a child. 1163 1164If we are the primary, we just hang onto our pid so we'll have it when 1165or if we start a child debugger. If we are a child, we'll set things up 1166so we'll have a unique greeting and so the parent will give us our own 1167TTY later. 1168 1169We save the current contents of the C<PERLDB_PIDS> environment variable 1170because we mess around with it. We'll also need to hang onto it because 1171we'll need it if we restart. 1172 1173Child debuggers make a label out of the current PID structure recorded in 1174PERLDB_PIDS plus the new PID. They also mark themselves as not having a TTY 1175yet so the parent will give them one later via C<resetterm()>. 1176 1177=cut 1178 1179# Save the current contents of the environment; we're about to 1180# much with it. We'll need this if we have to restart. 1181use vars qw($ini_pids); 1182$ini_pids = $ENV{PERLDB_PIDS}; 1183 1184use vars qw ($pids $term_pid); 1185 1186if ( defined $ENV{PERLDB_PIDS} ) { 1187 1188 # We're a child. Make us a label out of the current PID structure 1189 # recorded in PERLDB_PIDS plus our (new) PID. Mark us as not having 1190 # a term yet so the parent will give us one later via resetterm(). 1191 1192 my $env_pids = $ENV{PERLDB_PIDS}; 1193 $pids = "[$env_pids]"; 1194 1195 # Unless we are on OpenVMS, all programs under the DCL shell run under 1196 # the same PID. 1197 1198 if (($^O eq 'VMS') && ($env_pids =~ /\b$$\b/)) { 1199 $term_pid = $$; 1200 } 1201 else { 1202 $ENV{PERLDB_PIDS} .= "->$$"; 1203 $term_pid = -1; 1204 } 1205 1206} ## end if (defined $ENV{PERLDB_PIDS... 1207else { 1208 1209 # We're the parent PID. Initialize PERLDB_PID in case we end up with a 1210 # child debugger, and mark us as the parent, so we'll know to set up 1211 # more TTY's is we have to. 1212 $ENV{PERLDB_PIDS} = "$$"; 1213 $pids = "[pid=$$]"; 1214 $term_pid = $$; 1215} 1216 1217use vars qw($pidprompt); 1218$pidprompt = ''; 1219 1220# Sets up $emacs as a synonym for $slave_editor. 1221our ($slave_editor); 1222*emacs = $slave_editor if $slave_editor; # May be used in afterinit()... 1223 1224=head2 READING THE RC FILE 1225 1226The debugger will read a file of initialization options if supplied. If 1227running interactively, this is C<.perldb>; if not, it's C<perldb.ini>. 1228 1229=cut 1230 1231# As noted, this test really doesn't check accurately that the debugger 1232# is running at a terminal or not. 1233 1234use vars qw($rcfile); 1235{ 1236 my $dev_tty = (($^O eq 'VMS') ? 'TT:' : '/dev/tty'); 1237 # this is the wrong metric! 1238 $rcfile = ((-e $dev_tty) ? ".perldb" : "perldb.ini"); 1239} 1240 1241=pod 1242 1243The debugger does a safety test of the file to be read. It must be owned 1244either by the current user or root, and must only be writable by the owner. 1245 1246=cut 1247 1248# This wraps a safety test around "do" to read and evaluate the init file. 1249# 1250# This isn't really safe, because there's a race 1251# between checking and opening. The solution is to 1252# open and fstat the handle, but then you have to read and 1253# eval the contents. But then the silly thing gets 1254# your lexical scope, which is unfortunate at best. 1255sub safe_do { 1256 my $file = shift; 1257 1258 # Just exactly what part of the word "CORE::" don't you understand? 1259 local $SIG{__WARN__}; 1260 local $SIG{__DIE__}; 1261 1262 unless ( is_safe_file($file) ) { 1263 CORE::warn <<EO_GRIPE; 1264perldb: Must not source insecure rcfile $file. 1265 You or the superuser must be the owner, and it must not 1266 be writable by anyone but its owner. 1267EO_GRIPE 1268 return; 1269 } ## end unless (is_safe_file($file... 1270 1271 do $file; 1272 CORE::warn("perldb: couldn't parse $file: $@") if $@; 1273} ## end sub safe_do 1274 1275# This is the safety test itself. 1276# 1277# Verifies that owner is either real user or superuser and that no 1278# one but owner may write to it. This function is of limited use 1279# when called on a path instead of upon a handle, because there are 1280# no guarantees that filename (by dirent) whose file (by ino) is 1281# eventually accessed is the same as the one tested. 1282# Assumes that the file's existence is not in doubt. 1283sub is_safe_file { 1284 my $path = shift; 1285 stat($path) || return; # mysteriously vaporized 1286 my ( $dev, $ino, $mode, $nlink, $uid, $gid ) = stat(_); 1287 1288 return 0 if $uid != 0 && $uid != $<; 1289 return 0 if $mode & 022; 1290 return 1; 1291} ## end sub is_safe_file 1292 1293# If the rcfile (whichever one we decided was the right one to read) 1294# exists, we safely do it. 1295if ( -f $rcfile ) { 1296 safe_do("./$rcfile"); 1297} 1298 1299# If there isn't one here, try the user's home directory. 1300elsif ( defined $ENV{HOME} && -f "$ENV{HOME}/$rcfile" ) { 1301 safe_do("$ENV{HOME}/$rcfile"); 1302} 1303 1304# Else try the login directory. 1305elsif ( defined $ENV{LOGDIR} && -f "$ENV{LOGDIR}/$rcfile" ) { 1306 safe_do("$ENV{LOGDIR}/$rcfile"); 1307} 1308 1309# If the PERLDB_OPTS variable has options in it, parse those out next. 1310if ( defined $ENV{PERLDB_OPTS} ) { 1311 parse_options( $ENV{PERLDB_OPTS} ); 1312} 1313 1314=pod 1315 1316The last thing we do during initialization is determine which subroutine is 1317to be used to obtain a new terminal when a new debugger is started. Right now, 1318the debugger only handles TCP sockets, X11, OS/2, amd Mac OS X 1319(darwin). 1320 1321=cut 1322 1323# Set up the get_fork_TTY subroutine to be aliased to the proper routine. 1324# Works if you're running an xterm or xterm-like window, or you're on 1325# OS/2, or on Mac OS X. This may need some expansion. 1326 1327if (not defined &get_fork_TTY) # only if no routine exists 1328{ 1329 if ( defined $remoteport ) { 1330 # Expect an inetd-like server 1331 *get_fork_TTY = \&socket_get_fork_TTY; # to listen to us 1332 } 1333 elsif (defined $ENV{TERM} # If we know what kind 1334 # of terminal this is, 1335 and $ENV{TERM} eq 'xterm' # and it's an xterm, 1336 and defined $ENV{DISPLAY} # and what display it's on, 1337 ) 1338 { 1339 *get_fork_TTY = \&xterm_get_fork_TTY; # use the xterm version 1340 } 1341 elsif ( $ENV{TMUX} ) { 1342 *get_fork_TTY = \&tmux_get_fork_TTY; 1343 } 1344 elsif ( $^O eq 'os2' ) { # If this is OS/2, 1345 *get_fork_TTY = \&os2_get_fork_TTY; # use the OS/2 version 1346 } 1347 elsif ( $^O eq 'darwin' # If this is Mac OS X 1348 and defined $ENV{TERM_PROGRAM} # and we're running inside 1349 and $ENV{TERM_PROGRAM} 1350 eq 'Apple_Terminal' # Terminal.app 1351 ) 1352 { 1353 *get_fork_TTY = \&macosx_get_fork_TTY; # use the Mac OS X version 1354 } 1355} ## end if (not defined &get_fork_TTY... 1356 1357# untaint $^O, which may have been tainted by the last statement. 1358# see bug [perl #24674] 1359$^O =~ m/^(.*)\z/; 1360$^O = $1; 1361 1362# Here begin the unreadable code. It needs fixing. 1363 1364=head2 RESTART PROCESSING 1365 1366This section handles the restart command. When the C<R> command is invoked, it 1367tries to capture all of the state it can into environment variables, and 1368then sets C<PERLDB_RESTART>. When we start executing again, we check to see 1369if C<PERLDB_RESTART> is there; if so, we reload all the information that 1370the R command stuffed into the environment variables. 1371 1372 PERLDB_RESTART - flag only, contains no restart data itself. 1373 PERLDB_HIST - command history, if it's available 1374 PERLDB_ON_LOAD - breakpoints set by the rc file 1375 PERLDB_POSTPONE - subs that have been loaded/not executed, 1376 and have actions 1377 PERLDB_VISITED - files that had breakpoints 1378 PERLDB_FILE_... - breakpoints for a file 1379 PERLDB_OPT - active options 1380 PERLDB_INC - the original @INC 1381 PERLDB_PRETYPE - preprompt debugger actions 1382 PERLDB_PRE - preprompt Perl code 1383 PERLDB_POST - post-prompt Perl code 1384 PERLDB_TYPEAHEAD - typeahead captured by readline() 1385 1386We chug through all these variables and plug the values saved in them 1387back into the appropriate spots in the debugger. 1388 1389=cut 1390 1391use vars qw(%postponed_file @typeahead); 1392 1393our (@hist, @truehist); 1394 1395sub _restore_shared_globals_after_restart 1396{ 1397 @hist = get_list('PERLDB_HIST'); 1398 %break_on_load = get_list("PERLDB_ON_LOAD"); 1399 %postponed = get_list("PERLDB_POSTPONE"); 1400 1401 share(@hist); 1402 share(@truehist); 1403 share(%break_on_load); 1404 share(%postponed); 1405} 1406 1407sub _restore_breakpoints_and_actions { 1408 1409 my @had_breakpoints = get_list("PERLDB_VISITED"); 1410 1411 for my $file_idx ( 0 .. $#had_breakpoints ) { 1412 my $filename = $had_breakpoints[$file_idx]; 1413 my %pf = get_list("PERLDB_FILE_$file_idx"); 1414 $postponed_file{ $filename } = \%pf if %pf; 1415 my @lines = sort {$a <=> $b} keys(%pf); 1416 my @enabled_statuses = get_list("PERLDB_FILE_ENABLED_$file_idx"); 1417 for my $line_idx (0 .. $#lines) { 1418 _set_breakpoint_enabled_status( 1419 $filename, 1420 $lines[$line_idx], 1421 ($enabled_statuses[$line_idx] ? 1 : ''), 1422 ); 1423 } 1424 } 1425 1426 return; 1427} 1428 1429sub _restore_options_after_restart 1430{ 1431 my %options_map = get_list("PERLDB_OPT"); 1432 1433 while ( my ( $opt, $val ) = each %options_map ) { 1434 $val =~ s/[\\\']/\\$1/g; 1435 parse_options("$opt'$val'"); 1436 } 1437 1438 return; 1439} 1440 1441sub _restore_globals_after_restart 1442{ 1443 # restore original @INC 1444 @INC = get_list("PERLDB_INC"); 1445 @ini_INC = @INC; 1446 1447 # return pre/postprompt actions and typeahead buffer 1448 $pretype = [ get_list("PERLDB_PRETYPE") ]; 1449 $pre = [ get_list("PERLDB_PRE") ]; 1450 $post = [ get_list("PERLDB_POST") ]; 1451 @typeahead = get_list( "PERLDB_TYPEAHEAD", @typeahead ); 1452 1453 return; 1454} 1455 1456 1457if ( exists $ENV{PERLDB_RESTART} ) { 1458 1459 # We're restarting, so we don't need the flag that says to restart anymore. 1460 delete $ENV{PERLDB_RESTART}; 1461 1462 # $restart = 1; 1463 _restore_shared_globals_after_restart(); 1464 1465 _restore_breakpoints_and_actions(); 1466 1467 # restore options 1468 _restore_options_after_restart(); 1469 1470 _restore_globals_after_restart(); 1471} ## end if (exists $ENV{PERLDB_RESTART... 1472 1473=head2 SETTING UP THE TERMINAL 1474 1475Now, we'll decide how the debugger is going to interact with the user. 1476If there's no TTY, we set the debugger to run non-stop; there's not going 1477to be anyone there to enter commands. 1478 1479=cut 1480 1481use vars qw($notty $console $tty $LINEINFO); 1482use vars qw($lineinfo $doccmd); 1483 1484our ($runnonstop); 1485 1486# Local autoflush to avoid rt#116769, 1487# as calling IO::File methods causes an unresolvable loop 1488# that results in debugger failure. 1489sub _autoflush { 1490 my $o = select($_[0]); 1491 $|++; 1492 select($o); 1493} 1494 1495if ($notty) { 1496 $runnonstop = 1; 1497 share($runnonstop); 1498} 1499 1500=pod 1501 1502If there is a TTY, we have to determine who it belongs to before we can 1503proceed. If this is a slave editor or graphical debugger (denoted by 1504the first command-line switch being '-emacs'), we shift this off and 1505set C<$rl> to 0 (XXX ostensibly to do straight reads). 1506 1507=cut 1508 1509else { 1510 1511 # Is Perl being run from a slave editor or graphical debugger? 1512 # If so, don't use readline, and set $slave_editor = 1. 1513 if ($slave_editor = ( @main::ARGV && ( $main::ARGV[0] eq '-emacs' ) )) { 1514 $rl = 0; 1515 shift(@main::ARGV); 1516 } 1517 1518 #require Term::ReadLine; 1519 1520=pod 1521 1522We then determine what the console should be on various systems: 1523 1524=over 4 1525 1526=item * Cygwin - We use C<stdin> instead of a separate device. 1527 1528=cut 1529 1530 if ( $^O eq 'cygwin' ) { 1531 1532 # /dev/tty is binary. use stdin for textmode 1533 undef $console; 1534 } 1535 1536=item * Windows or MSDOS - use C<con>. 1537 1538=cut 1539 1540 elsif ( $^O eq 'dos' or -e "con" or $^O eq 'MSWin32' ) { 1541 $console = "con"; 1542 } 1543 1544=item * AmigaOS - use C<CONSOLE:>. 1545 1546=cut 1547 1548 elsif ( $^O eq 'amigaos' ) { 1549 $console = "CONSOLE:"; 1550 } 1551 1552=item * VMS - use C<sys$command>. 1553 1554=cut 1555 1556 elsif ($^O eq 'VMS') { 1557 $console = 'sys$command'; 1558 } 1559 1560# Keep this penultimate, on the grounds that it satisfies a wide variety of 1561# Unix-like systems that would otherwise need to be identified individually. 1562 1563=item * Unix - use F</dev/tty>. 1564 1565=cut 1566 1567 elsif ( -e "/dev/tty" ) { 1568 $console = "/dev/tty"; 1569 } 1570 1571# Keep this last. 1572 1573 else { 1574 _db_warn("Can't figure out your console, using stdin"); 1575 undef $console; 1576 } 1577 1578=pod 1579 1580=back 1581 1582Several other systems don't use a specific console. We C<undef $console> 1583for those (Windows using a slave editor/graphical debugger, NetWare, OS/2 1584with a slave editor). 1585 1586=cut 1587 1588 if ( ( $^O eq 'MSWin32' ) and ( $slave_editor or defined $ENV{EMACS} ) ) { 1589 1590 # /dev/tty is binary. use stdin for textmode 1591 $console = undef; 1592 } 1593 1594 if ( $^O eq 'NetWare' ) { 1595 1596 # /dev/tty is binary. use stdin for textmode 1597 $console = undef; 1598 } 1599 1600 # In OS/2, we need to use STDIN to get textmode too, even though 1601 # it pretty much looks like Unix otherwise. 1602 if ( defined $ENV{OS2_SHELL} and ( $slave_editor or $ENV{WINDOWID} ) ) 1603 { # In OS/2 1604 $console = undef; 1605 } 1606 1607=pod 1608 1609If there is a TTY hanging around from a parent, we use that as the console. 1610 1611=cut 1612 1613 $console = $tty if defined $tty; 1614 1615=head2 SOCKET HANDLING 1616 1617The debugger is capable of opening a socket and carrying out a debugging 1618session over the socket. 1619 1620If C<RemotePort> was defined in the options, the debugger assumes that it 1621should try to start a debugging session on that port. It builds the socket 1622and then tries to connect the input and output filehandles to it. 1623 1624=cut 1625 1626 # Handle socket stuff. 1627 1628 if ( defined $remoteport ) { 1629 1630 # If RemotePort was defined in the options, connect input and output 1631 # to the socket. 1632 $IN = $OUT = connect_remoteport(); 1633 } ## end if (defined $remoteport) 1634 1635=pod 1636 1637If no C<RemotePort> was defined, and we want to create a TTY on startup, 1638this is probably a situation where multiple debuggers are running (for example, 1639a backticked command that starts up another debugger). We create a new IN and 1640OUT filehandle, and do the necessary mojo to create a new TTY if we know how 1641and if we can. 1642 1643=cut 1644 1645 # Non-socket. 1646 else { 1647 1648 # Two debuggers running (probably a system or a backtick that invokes 1649 # the debugger itself under the running one). create a new IN and OUT 1650 # filehandle, and do the necessary mojo to create a new tty if we 1651 # know how, and we can. 1652 create_IN_OUT(4) if $CreateTTY & 4; 1653 if ($console) { 1654 1655 # If we have a console, check to see if there are separate ins and 1656 # outs to open. (They are assumed identical if not.) 1657 1658 my ( $i, $o ) = split /,/, $console; 1659 $o = $i unless defined $o; 1660 1661 # read/write on in, or just read, or read on STDIN. 1662 open( IN, '+<', $i ) 1663 || open( IN, '<', $i ) 1664 || open( IN, "<&STDIN" ); 1665 1666 # read/write/create/clobber out, or write/create/clobber out, 1667 # or merge with STDERR, or merge with STDOUT. 1668 open( OUT, '+>', $o ) 1669 || open( OUT, '>', $o ) 1670 || open( OUT, ">&STDERR" ) 1671 || open( OUT, ">&STDOUT" ); # so we don't dongle stdout 1672 1673 } ## end if ($console) 1674 elsif ( not defined $console ) { 1675 1676 # No console. Open STDIN. 1677 open( IN, "<&STDIN" ); 1678 1679 # merge with STDERR, or with STDOUT. 1680 open( OUT, ">&STDERR" ) 1681 || open( OUT, ">&STDOUT" ); # so we don't dongle stdout 1682 $console = 'STDIN/OUT'; 1683 } ## end elsif (not defined $console) 1684 1685 # Keep copies of the filehandles so that when the pager runs, it 1686 # can close standard input without clobbering ours. 1687 if ($console or (not defined($console))) { 1688 $IN = \*IN; 1689 $OUT = \*OUT; 1690 } 1691 } ## end elsif (from if(defined $remoteport)) 1692 1693 # Unbuffer DB::OUT. We need to see responses right away. 1694 _autoflush($OUT); 1695 1696 # Line info goes to debugger output unless pointed elsewhere. 1697 # Pointing elsewhere makes it possible for slave editors to 1698 # keep track of file and position. We have both a filehandle 1699 # and a I/O description to keep track of. 1700 $LINEINFO = $OUT unless defined $LINEINFO; 1701 $lineinfo = $console unless defined $lineinfo; 1702 # share($LINEINFO); # <- unable to share globs 1703 share($lineinfo); # 1704 1705=pod 1706 1707To finish initialization, we show the debugger greeting, 1708and then call the C<afterinit()> subroutine if there is one. 1709 1710=cut 1711 1712 # Show the debugger greeting. 1713 $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/; 1714 unless ($runnonstop) { 1715 local $\ = ''; 1716 local $, = ''; 1717 if ( $term_pid eq '-1' ) { 1718 print $OUT "\nDaughter DB session started...\n"; 1719 } 1720 else { 1721 print $OUT "\nLoading DB routines from $header\n"; 1722 print $OUT ( 1723 "Editor support ", 1724 $slave_editor ? "enabled" : "available", ".\n" 1725 ); 1726 print $OUT 1727"\nEnter h or 'h h' for help, or '$doccmd perldebug' for more help.\n\n"; 1728 } ## end else [ if ($term_pid eq '-1') 1729 } ## end unless ($runnonstop) 1730} ## end else [ if ($notty) 1731 1732# XXX This looks like a bug to me. 1733# Why copy to @ARGS and then futz with @args? 1734@ARGS = @ARGV; 1735# for (@args) { 1736 # Make sure backslashes before single quotes are stripped out, and 1737 # keep args unless they are numeric (XXX why?) 1738 # s/\'/\\\'/g; # removed while not justified understandably 1739 # s/(.*)/'$1'/ unless /^-?[\d.]+$/; # ditto 1740# } 1741 1742# If there was an afterinit() sub defined, call it. It will get 1743# executed in our scope, so it can fiddle with debugger globals. 1744if ( defined &afterinit ) { # May be defined in $rcfile 1745 afterinit(); 1746} 1747 1748# Inform us about "Stack dump during die enabled ..." in dieLevel(). 1749use vars qw($I_m_init); 1750 1751$I_m_init = 1; 1752 1753############################################################ Subroutines 1754 1755=head1 SUBROUTINES 1756 1757=head2 DB 1758 1759This gigantic subroutine is the heart of the debugger. Called before every 1760statement, its job is to determine if a breakpoint has been reached, and 1761stop if so; read commands from the user, parse them, and execute 1762them, and then send execution off to the next statement. 1763 1764Note that the order in which the commands are processed is very important; 1765some commands earlier in the loop will actually alter the C<$cmd> variable 1766to create other commands to be executed later. This is all highly I<optimized> 1767but can be confusing. Check the comments for each C<$cmd ... && do {}> to 1768see what's happening in any given command. 1769 1770=cut 1771 1772# $cmd cannot be an our() variable unfortunately (possible perl bug?). 1773 1774use vars qw( 1775 $action 1776 $cmd 1777 $file 1778 $filename_ini 1779 $finished 1780 %had_breakpoints 1781 $level 1782 $max 1783 $package 1784 $try 1785); 1786 1787our ( 1788 %alias, 1789 $doret, 1790 $end, 1791 $fall_off_end, 1792 $incr, 1793 $laststep, 1794 $rc, 1795 $sh, 1796 $stack_depth, 1797 @stack, 1798 @to_watch, 1799 @old_watch, 1800); 1801 1802sub _DB__use_full_path 1803{ 1804 local @INC = @INC; 1805 eval { require Config; }; 1806 unshift(@INC, 1807 @Config::Config{qw(archlibexp privlibexp sitearchexp sitelibexp)}); 1808 &{$_[0]}; 1809} 1810 1811sub _DB__determine_if_we_should_break 1812{ 1813 # if we have something here, see if we should break. 1814 # $stop is lexical and local to this block - $action on the other hand 1815 # is global. 1816 my $stop; 1817 1818 if ( $dbline{$line} 1819 && _is_breakpoint_enabled($filename, $line) 1820 && (( $stop, $action ) = split( /\0/, $dbline{$line} ) ) ) 1821 { 1822 1823 # Stop if the stop criterion says to just stop. 1824 if ( $stop eq '1' ) { 1825 $signal |= 1; 1826 } 1827 1828 # It's a conditional stop; eval it in the user's context and 1829 # see if we should stop. If so, remove the one-time sigil. 1830 elsif ($stop) { 1831 $evalarg = "\$DB::signal |= 1 if do {$stop}"; 1832 # The &-call is here to ascertain the mutability of @_. 1833 &DB::eval; 1834 # If the breakpoint is temporary, then delete its enabled status. 1835 if ($dbline{$line} =~ s/;9($|\0)/$1/) { 1836 _cancel_breakpoint_temp_enabled_status($filename, $line); 1837 } 1838 } 1839 } ## end if ($dbline{$line} && ... 1840} 1841 1842sub _DB__is_finished { 1843 if ($finished and $level <= 1) { 1844 end_report(); 1845 return 1; 1846 } 1847 else { 1848 return; 1849 } 1850} 1851 1852sub _DB__read_next_cmd 1853{ 1854 my ($tid) = @_; 1855 1856 # We have a terminal, or can get one ... 1857 if (!$term) { 1858 setterm(); 1859 } 1860 1861 # ... and it belongs to this PID or we get one for this PID ... 1862 if ($term_pid != $$) { 1863 resetterm(1); 1864 } 1865 1866 # ... and we got a line of command input ... 1867 $cmd = DB::readline( 1868 "$pidprompt $tid DB" 1869 . ( '<' x $level ) 1870 . ( $#hist + 1 ) 1871 . ( '>' x $level ) . " " 1872 ); 1873 1874 return defined($cmd); 1875} 1876 1877sub _DB__trim_command_and_return_first_component { 1878 my ($obj) = @_; 1879 1880 $cmd =~ s/\A\s+//s; # trim annoying leading whitespace 1881 $cmd =~ s/\s+\z//s; # trim annoying trailing whitespace 1882 1883 # A single-character debugger command can be immediately followed by its 1884 # argument if they aren't both alphanumeric; otherwise require space 1885 # between commands and arguments: 1886 my ($verb, $args) = $cmd =~ m{\A(.\b|\S*)\s*(.*)}s; 1887 1888 $obj->cmd_verb($verb); 1889 $obj->cmd_args($args); 1890 1891 return; 1892} 1893 1894sub _DB__handle_f_command { 1895 my ($obj) = @_; 1896 1897 if ($file = $obj->cmd_args) { 1898 # help for no arguments (old-style was return from sub). 1899 if ( !$file ) { 1900 print $OUT 1901 "The old f command is now the r command.\n"; # hint 1902 print $OUT "The new f command switches filenames.\n"; 1903 next CMD; 1904 } ## end if (!$file) 1905 1906 # if not in magic file list, try a close match. 1907 if ( !defined $main::{ '_<' . $file } ) { 1908 if ( ($try) = grep( m#^_<.*$file#, keys %main:: ) ) { 1909 { 1910 $try = substr( $try, 2 ); 1911 print $OUT "Choosing $try matching '$file':\n"; 1912 $file = $try; 1913 } 1914 } ## end if (($try) = grep(m#^_<.*$file#... 1915 } ## end if (!defined $main::{ ... 1916 1917 # If not successfully switched now, we failed. 1918 if ( !defined $main::{ '_<' . $file } ) { 1919 print $OUT "No file matching '$file' is loaded.\n"; 1920 next CMD; 1921 } 1922 1923 # We switched, so switch the debugger internals around. 1924 elsif ( $file ne $filename ) { 1925 *dbline = $main::{ '_<' . $file }; 1926 $max = $#dbline; 1927 $filename = $file; 1928 $start = 1; 1929 $cmd = "l"; 1930 } ## end elsif ($file ne $filename) 1931 1932 # We didn't switch; say we didn't. 1933 else { 1934 print $OUT "Already in $file.\n"; 1935 next CMD; 1936 } 1937 } 1938 1939 return; 1940} 1941 1942sub _DB__handle_dot_command { 1943 my ($obj) = @_; 1944 1945 # . command. 1946 if ($obj->_is_full('.')) { 1947 $incr = -1; # stay at current line 1948 1949 # Reset everything to the old location. 1950 $start = $line; 1951 $filename = $filename_ini; 1952 *dbline = $main::{ '_<' . $filename }; 1953 $max = $#dbline; 1954 1955 # Now where are we? 1956 print_lineinfo($obj->position()); 1957 next CMD; 1958 } 1959 1960 return; 1961} 1962 1963sub _DB__handle_y_command { 1964 my ($obj) = @_; 1965 1966 if (my ($match_level, $match_vars) 1967 = $obj->cmd_args =~ /\A(?:(\d*)\s*(.*))?\z/) { 1968 1969 # See if we've got the necessary support. 1970 if (!eval { 1971 local @INC = @INC; 1972 pop @INC if $INC[-1] eq '.'; 1973 _DB__use_full_path(sub { 1974 require PadWalker; 1975 }); 1976 PadWalker->VERSION(0.08) }) { 1977 my $Err = $@; 1978 _db_warn( 1979 $Err =~ /locate/ 1980 ? "PadWalker module not found - please install\n" 1981 : $Err 1982 ); 1983 next CMD; 1984 } 1985 1986 # Load up dumpvar if we don't have it. If we can, that is. 1987 do 'dumpvar.pl' || die $@ unless defined &main::dumpvar; 1988 defined &main::dumpvar 1989 or print $OUT "dumpvar.pl not available.\n" 1990 and next CMD; 1991 1992 # Got all the modules we need. Find them and print them. 1993 my @vars = split( ' ', $match_vars || '' ); 1994 1995 # Find the pad. 1996 my $h = eval { PadWalker::peek_my( ( $match_level || 0 ) + 2 ) }; 1997 1998 # Oops. Can't find it. 1999 if (my $Err = $@) { 2000 $Err =~ s/ at .*//; 2001 _db_warn($Err); 2002 next CMD; 2003 } 2004 2005 # Show the desired vars with dumplex(). 2006 my $savout = select($OUT); 2007 2008 # Have dumplex dump the lexicals. 2009 foreach my $key (sort keys %$h) { 2010 dumpvar::dumplex( $key, $h->{$key}, 2011 defined $option{dumpDepth} ? $option{dumpDepth} : -1, 2012 @vars ); 2013 } 2014 select($savout); 2015 next CMD; 2016 } 2017} 2018 2019sub _DB__handle_c_command { 2020 my ($obj) = @_; 2021 2022 my $i = $obj->cmd_args; 2023 2024 if ($i =~ m#\A[\w:]*\z#) { 2025 2026 # Hey, show's over. The debugged program finished 2027 # executing already. 2028 next CMD if _DB__is_finished(); 2029 2030 # Capture the place to put a one-time break. 2031 $subname = $i; 2032 2033 # Probably not needed, since we finish an interactive 2034 # sub-session anyway... 2035 # local $filename = $filename; 2036 # local *dbline = *dbline; # XXX Would this work?! 2037 # 2038 # The above question wonders if localizing the alias 2039 # to the magic array works or not. Since it's commented 2040 # out, we'll just leave that to speculation for now. 2041 2042 # If the "subname" isn't all digits, we'll assume it 2043 # is a subroutine name, and try to find it. 2044 if ( $subname =~ /\D/ ) { # subroutine name 2045 # Qualify it to the current package unless it's 2046 # already qualified. 2047 $subname = $package . "::" . $subname 2048 unless $subname =~ /::/; 2049 2050 # find_sub will return "file:line_number" corresponding 2051 # to where the subroutine is defined; we call find_sub, 2052 # break up the return value, and assign it in one 2053 # operation. 2054 ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(.*)$/ ); 2055 2056 # Force the line number to be numeric. 2057 $i = $i + 0; 2058 2059 # If we got a line number, we found the sub. 2060 if ($i) { 2061 2062 # Switch all the debugger's internals around so 2063 # we're actually working with that file. 2064 $filename = $file; 2065 *dbline = $main::{ '_<' . $filename }; 2066 2067 # Mark that there's a breakpoint in this file. 2068 $had_breakpoints{$filename} |= 1; 2069 2070 # Scan forward to the first executable line 2071 # after the 'sub whatever' line. 2072 $max = $#dbline; 2073 my $_line_num = $i; 2074 while ($dbline[$_line_num] == 0 && $_line_num< $max) 2075 { 2076 $_line_num++; 2077 } 2078 $i = $_line_num; 2079 } ## end if ($i) 2080 2081 # We didn't find a sub by that name. 2082 else { 2083 print $OUT "Subroutine $subname not found.\n"; 2084 next CMD; 2085 } 2086 } ## end if ($subname =~ /\D/) 2087 2088 # At this point, either the subname was all digits (an 2089 # absolute line-break request) or we've scanned through 2090 # the code following the definition of the sub, looking 2091 # for an executable, which we may or may not have found. 2092 # 2093 # If $i (which we set $subname from) is non-zero, we 2094 # got a request to break at some line somewhere. On 2095 # one hand, if there wasn't any real subroutine name 2096 # involved, this will be a request to break in the current 2097 # file at the specified line, so we have to check to make 2098 # sure that the line specified really is breakable. 2099 # 2100 # On the other hand, if there was a subname supplied, the 2101 # preceding block has moved us to the proper file and 2102 # location within that file, and then scanned forward 2103 # looking for the next executable line. We have to make 2104 # sure that one was found. 2105 # 2106 # On the gripping hand, we can't do anything unless the 2107 # current value of $i points to a valid breakable line. 2108 # Check that. 2109 if ($i) { 2110 2111 # Breakable? 2112 if ( $dbline[$i] == 0 ) { 2113 print $OUT "Line $i not breakable.\n"; 2114 next CMD; 2115 } 2116 2117 # Yes. Set up the one-time-break sigil. 2118 $dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p. 2119 _enable_breakpoint_temp_enabled_status($filename, $i); 2120 } ## end if ($i) 2121 2122 # Turn off stack tracing from here up. 2123 for my $j (0 .. $stack_depth) { 2124 $stack[ $j ] &= ~1; 2125 } 2126 last CMD; 2127 } 2128 2129 return; 2130} 2131 2132sub _DB__handle_forward_slash_command { 2133 my ($obj) = @_; 2134 2135 # The pattern as a string. 2136 use vars qw($inpat); 2137 2138 if (($inpat) = $cmd =~ m#\A/(.*)\z#) { 2139 2140 # Remove the final slash. 2141 $inpat =~ s:([^\\])/$:$1:; 2142 2143 # If the pattern isn't null ... 2144 if ( $inpat ne "" ) { 2145 2146 # Turn off warn and die processing for a bit. 2147 local $SIG{__DIE__}; 2148 local $SIG{__WARN__}; 2149 2150 # Create the pattern. 2151 eval 'no strict q/vars/; $inpat =~ m' . "\a$inpat\a"; 2152 if ( $@ ne "" ) { 2153 2154 # Oops. Bad pattern. No biscuit. 2155 # Print the eval error and go back for more 2156 # commands. 2157 print {$OUT} "$@"; 2158 next CMD; 2159 } 2160 $obj->pat($inpat); 2161 } ## end if ($inpat ne "") 2162 2163 # Set up to stop on wrap-around. 2164 $end = $start; 2165 2166 # Don't move off the current line. 2167 $incr = -1; 2168 2169 my $pat = $obj->pat; 2170 2171 # Done in eval so nothing breaks if the pattern 2172 # does something weird. 2173 eval 2174 { 2175 no strict q/vars/; 2176 for (;;) { 2177 # Move ahead one line. 2178 ++$start; 2179 2180 # Wrap if we pass the last line. 2181 if ($start > $max) { 2182 $start = 1; 2183 } 2184 2185 # Stop if we have gotten back to this line again, 2186 last if ($start == $end); 2187 2188 # A hit! (Note, though, that we are doing 2189 # case-insensitive matching. Maybe a qr// 2190 # expression would be better, so the user could 2191 # do case-sensitive matching if desired. 2192 if ($dbline[$start] =~ m/$pat/i) { 2193 if ($slave_editor) { 2194 # Handle proper escaping in the slave. 2195 print {$OUT} "\032\032$filename:$start:0\n"; 2196 } 2197 else { 2198 # Just print the line normally. 2199 print {$OUT} "$start:\t",$dbline[$start],"\n"; 2200 } 2201 # And quit since we found something. 2202 last; 2203 } 2204 } 2205 }; 2206 2207 if ($@) { 2208 warn $@; 2209 } 2210 2211 # If we wrapped, there never was a match. 2212 if ( $start == $end ) { 2213 print {$OUT} "/$pat/: not found\n"; 2214 } 2215 next CMD; 2216 } 2217 2218 return; 2219} 2220 2221sub _DB__handle_question_mark_command { 2222 my ($obj) = @_; 2223 2224 # ? - backward pattern search. 2225 if (my ($inpat) = $cmd =~ m#\A\?(.*)\z#) { 2226 2227 # Get the pattern, remove trailing question mark. 2228 $inpat =~ s:([^\\])\?$:$1:; 2229 2230 # If we've got one ... 2231 if ( $inpat ne "" ) { 2232 2233 # Turn off die & warn handlers. 2234 local $SIG{__DIE__}; 2235 local $SIG{__WARN__}; 2236 eval '$inpat =~ m' . "\a$inpat\a"; 2237 2238 if ( $@ ne "" ) { 2239 2240 # Ouch. Not good. Print the error. 2241 print $OUT $@; 2242 next CMD; 2243 } 2244 $obj->pat($inpat); 2245 } ## end if ($inpat ne "") 2246 2247 # Where we are now is where to stop after wraparound. 2248 $end = $start; 2249 2250 # Don't move away from this line. 2251 $incr = -1; 2252 2253 my $pat = $obj->pat; 2254 # Search inside the eval to prevent pattern badness 2255 # from killing us. 2256 eval { 2257 no strict q/vars/; 2258 for (;;) { 2259 # Back up a line. 2260 --$start; 2261 2262 # Wrap if we pass the first line. 2263 2264 $start = $max if ($start <= 0); 2265 2266 # Quit if we get back where we started, 2267 last if ($start == $end); 2268 2269 # Match? 2270 if ($dbline[$start] =~ m/$pat/i) { 2271 if ($slave_editor) { 2272 # Yep, follow slave editor requirements. 2273 print $OUT "\032\032$filename:$start:0\n"; 2274 } 2275 else { 2276 # Yep, just print normally. 2277 print $OUT "$start:\t",$dbline[$start],"\n"; 2278 } 2279 2280 # Found, so done. 2281 last; 2282 } 2283 } 2284 }; 2285 2286 # Say we failed if the loop never found anything, 2287 if ( $start == $end ) { 2288 print {$OUT} "?$pat?: not found\n"; 2289 } 2290 next CMD; 2291 } 2292 2293 return; 2294} 2295 2296sub _DB__handle_restart_and_rerun_commands { 2297 my ($obj) = @_; 2298 2299 my $cmd_cmd = $obj->cmd_verb; 2300 my $cmd_params = $obj->cmd_args; 2301 # R - restart execution. 2302 # rerun - controlled restart execution. 2303 if ($cmd_cmd eq 'rerun' or $cmd_params eq '') { 2304 2305 # Change directory to the initial current working directory on 2306 # the script startup, so if the debugged program changed the 2307 # directory, then we will still be able to find the path to the 2308 # program. (perl 5 RT #121509 ). 2309 chdir ($_initial_cwd); 2310 2311 my @args = ($cmd_cmd eq 'R' ? restart() : rerun($cmd_params)); 2312 2313 # Close all non-system fds for a clean restart. A more 2314 # correct method would be to close all fds that were not 2315 # open when the process started, but this seems to be 2316 # hard. See "debugger 'R'estart and open database 2317 # connections" on p5p. 2318 2319 my $max_fd = 1024; # default if POSIX can't be loaded 2320 if (eval { require POSIX }) { 2321 eval { $max_fd = POSIX::sysconf(POSIX::_SC_OPEN_MAX()) }; 2322 } 2323 2324 if (defined $max_fd) { 2325 foreach ($^F+1 .. $max_fd-1) { 2326 next unless open FD_TO_CLOSE, "<&=$_"; 2327 close(FD_TO_CLOSE); 2328 } 2329 } 2330 2331 # And run Perl again. We use exec() to keep the 2332 # PID stable (and that way $ini_pids is still valid). 2333 exec(@args) or print {$OUT} "exec failed: $!\n"; 2334 2335 last CMD; 2336 } 2337 2338 return; 2339} 2340 2341sub _DB__handle_run_command_in_pager_command { 2342 my ($obj) = @_; 2343 2344 if ($cmd =~ m#\A\|\|?\s*[^|]#) { 2345 if ( $pager =~ /^\|/ ) { 2346 2347 # Default pager is into a pipe. Redirect I/O. 2348 open( SAVEOUT, ">&STDOUT" ) 2349 || _db_warn("Can't save STDOUT"); 2350 open( STDOUT, ">&OUT" ) 2351 || _db_warn("Can't redirect STDOUT"); 2352 } ## end if ($pager =~ /^\|/) 2353 else { 2354 2355 # Not into a pipe. STDOUT is safe. 2356 open( SAVEOUT, ">&OUT" ) || _db_warn("Can't save DB::OUT"); 2357 } 2358 2359 # Fix up environment to record we have less if so. 2360 fix_less(); 2361 2362 unless ( $obj->piped(scalar ( open( OUT, $pager ) ) ) ) { 2363 2364 # Couldn't open pipe to pager. 2365 _db_warn("Can't pipe output to '$pager'"); 2366 if ( $pager =~ /^\|/ ) { 2367 2368 # Redirect I/O back again. 2369 open( OUT, ">&STDOUT" ) # XXX: lost message 2370 || _db_warn("Can't restore DB::OUT"); 2371 open( STDOUT, ">&SAVEOUT" ) 2372 || _db_warn("Can't restore STDOUT"); 2373 close(SAVEOUT); 2374 } ## end if ($pager =~ /^\|/) 2375 else { 2376 2377 # Redirect I/O. STDOUT already safe. 2378 open( OUT, ">&STDOUT" ) # XXX: lost message 2379 || _db_warn("Can't restore DB::OUT"); 2380 } 2381 next CMD; 2382 } ## end unless ($piped = open(OUT,... 2383 2384 # Set up broken-pipe handler if necessary. 2385 $SIG{PIPE} = \&DB::catch 2386 if $pager =~ /^\|/ 2387 && ( "" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE} ); 2388 2389 _autoflush(\*OUT); 2390 # Save current filehandle, and put it back. 2391 $obj->selected(scalar( select(OUT) )); 2392 # Don't put it back if pager was a pipe. 2393 if ($cmd !~ /\A\|\|/) 2394 { 2395 select($obj->selected()); 2396 $obj->selected(""); 2397 } 2398 2399 # Trim off the pipe symbols and run the command now. 2400 $cmd =~ s#\A\|+\s*##; 2401 redo PIPE; 2402 } 2403 2404 return; 2405} 2406 2407sub _DB__handle_m_command { 2408 my ($obj) = @_; 2409 2410 if ($cmd =~ s#\Am\s+([\w:]+)\s*\z# #) { 2411 methods($1); 2412 next CMD; 2413 } 2414 2415 # m expr - set up DB::eval to do the work 2416 if ($cmd =~ s#\Am\b# #) { # Rest gets done by DB::eval() 2417 $onetimeDump = 'methods'; # method output gets used there 2418 } 2419 2420 return; 2421} 2422 2423sub _DB__at_end_of_every_command { 2424 my ($obj) = @_; 2425 2426 # At the end of every command: 2427 if ($obj->piped) { 2428 2429 # Unhook the pipe mechanism now. 2430 if ( $pager =~ /^\|/ ) { 2431 2432 # No error from the child. 2433 $? = 0; 2434 2435 # we cannot warn here: the handle is missing --tchrist 2436 close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n"; 2437 2438 # most of the $? crud was coping with broken cshisms 2439 # $? is explicitly set to 0, so this never runs. 2440 if ($?) { 2441 print SAVEOUT "Pager '$pager' failed: "; 2442 if ( $? == -1 ) { 2443 print SAVEOUT "shell returned -1\n"; 2444 } 2445 elsif ( $? >> 8 ) { 2446 print SAVEOUT ( $? & 127 ) 2447 ? " (SIG#" . ( $? & 127 ) . ")" 2448 : "", ( $? & 128 ) ? " -- core dumped" : "", "\n"; 2449 } 2450 else { 2451 print SAVEOUT "status ", ( $? >> 8 ), "\n"; 2452 } 2453 } ## end if ($?) 2454 2455 # Reopen filehandle for our output (if we can) and 2456 # restore STDOUT (if we can). 2457 open( OUT, ">&STDOUT" ) || _db_warn("Can't restore DB::OUT"); 2458 open( STDOUT, ">&SAVEOUT" ) 2459 || _db_warn("Can't restore STDOUT"); 2460 2461 # Turn off pipe exception handler if necessary. 2462 $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch; 2463 2464 # Will stop ignoring SIGPIPE if done like nohup(1) 2465 # does SIGINT but Perl doesn't give us a choice. 2466 } ## end if ($pager =~ /^\|/) 2467 else { 2468 2469 # Non-piped "pager". Just restore STDOUT. 2470 open( OUT, ">&SAVEOUT" ) || _db_warn("Can't restore DB::OUT"); 2471 } 2472 2473 # Let Readline know about the new filehandles. 2474 reset_IN_OUT( \*IN, \*OUT ); 2475 2476 # Close filehandle pager was using, restore the normal one 2477 # if necessary, 2478 close(SAVEOUT); 2479 2480 if ($obj->selected() ne "") { 2481 select($obj->selected); 2482 $obj->selected(""); 2483 } 2484 2485 # No pipes now. 2486 $obj->piped(""); 2487 } ## end if ($piped) 2488 2489 return; 2490} 2491 2492sub _DB__handle_watch_expressions 2493{ 2494 my $self = shift; 2495 2496 if ( $DB::trace & 2 ) { 2497 for my $n (0 .. $#DB::to_watch) { 2498 $DB::evalarg = $DB::to_watch[$n]; 2499 local $DB::onetimeDump; # Tell DB::eval() to not output results 2500 2501 # Fix context DB::eval() wants to return an array, but 2502 # we need a scalar here. 2503 my ($val) = join( "', '", DB::eval(@_) ); 2504 $val = ( ( defined $val ) ? "'$val'" : 'undef' ); 2505 2506 # Did it change? 2507 if ( $val ne $DB::old_watch[$n] ) { 2508 2509 # Yep! Show the difference, and fake an interrupt. 2510 $DB::signal = 1; 2511 print {$DB::OUT} <<EOP; 2512Watchpoint $n:\t$DB::to_watch[$n] changed: 2513 old value:\t$DB::old_watch[$n] 2514 new value:\t$val 2515EOP 2516 $DB::old_watch[$n] = $val; 2517 } ## end if ($val ne $old_watch... 2518 } ## end for my $n (0 .. 2519 } ## end if ($trace & 2) 2520 2521 return; 2522} 2523 2524# 't' is type. 2525# 'm' is method. 2526# 'v' is the value (i.e: method name or subroutine ref). 2527# 's' is subroutine. 2528my %cmd_lookup; 2529 2530BEGIN 2531{ 2532 %cmd_lookup = 2533( 2534 '-' => { t => 'm', v => '_handle_dash_command', }, 2535 '.' => { t => 's', v => \&_DB__handle_dot_command, }, 2536 '=' => { t => 'm', v => '_handle_equal_sign_command', }, 2537 'H' => { t => 'm', v => '_handle_H_command', }, 2538 'S' => { t => 'm', v => '_handle_S_command', }, 2539 'T' => { t => 'm', v => '_handle_T_command', }, 2540 'W' => { t => 'm', v => '_handle_W_command', }, 2541 'c' => { t => 's', v => \&_DB__handle_c_command, }, 2542 'f' => { t => 's', v => \&_DB__handle_f_command, }, 2543 'm' => { t => 's', v => \&_DB__handle_m_command, }, 2544 'n' => { t => 'm', v => '_handle_n_command', }, 2545 'p' => { t => 'm', v => '_handle_p_command', }, 2546 'q' => { t => 'm', v => '_handle_q_command', }, 2547 'r' => { t => 'm', v => '_handle_r_command', }, 2548 's' => { t => 'm', v => '_handle_s_command', }, 2549 'save' => { t => 'm', v => '_handle_save_command', }, 2550 'source' => { t => 'm', v => '_handle_source_command', }, 2551 't' => { t => 'm', v => '_handle_t_command', }, 2552 'w' => { t => 'm', v => '_handle_w_command', }, 2553 'x' => { t => 'm', v => '_handle_x_command', }, 2554 'y' => { t => 's', v => \&_DB__handle_y_command, }, 2555 (map { $_ => { t => 'm', v => '_handle_V_command_and_X_command', }, } 2556 ('X', 'V')), 2557 (map { $_ => { t => 'm', v => '_handle_enable_disable_commands', }, } 2558 qw(enable disable)), 2559 (map { $_ => 2560 { t => 's', v => \&_DB__handle_restart_and_rerun_commands, }, 2561 } qw(R rerun)), 2562 (map { $_ => {t => 'm', v => '_handle_cmd_wrapper_commands' }, } 2563 qw(a A b B e E h i l L M o O v w W)), 2564); 2565}; 2566 2567sub DB { 2568 2569 # lock the debugger and get the thread id for the prompt 2570 lock($DBGR); 2571 my $tid; 2572 my $position; 2573 my ($prefix, $after, $infix); 2574 my $pat; 2575 my $explicit_stop; 2576 my $piped; 2577 my $selected; 2578 2579 if ($ENV{PERL5DB_THREADED}) { 2580 $tid = eval { "[".threads->tid."]" }; 2581 } 2582 2583 my $cmd_verb; 2584 my $cmd_args; 2585 2586 my $obj = DB::Obj->new( 2587 { 2588 position => \$position, 2589 prefix => \$prefix, 2590 after => \$after, 2591 explicit_stop => \$explicit_stop, 2592 infix => \$infix, 2593 cmd_args => \$cmd_args, 2594 cmd_verb => \$cmd_verb, 2595 pat => \$pat, 2596 piped => \$piped, 2597 selected => \$selected, 2598 }, 2599 ); 2600 2601 $obj->_DB_on_init__initialize_globals(@_); 2602 2603 # Preserve current values of $@, $!, $^E, $,, $/, $\, $^W. 2604 # The code being debugged may have altered them. 2605 DB::save(); 2606 2607 # Since DB::DB gets called after every line, we can use caller() to 2608 # figure out where we last were executing. Sneaky, eh? This works because 2609 # caller is returning all the extra information when called from the 2610 # debugger. 2611 local ( $package, $filename, $line ) = caller; 2612 $filename_ini = $filename; 2613 2614 # set up the context for DB::eval, so it can properly execute 2615 # code on behalf of the user. We add the package in so that the 2616 # code is eval'ed in the proper package (not in the debugger!). 2617 local $usercontext = _calc_usercontext($package); 2618 2619 # Create an alias to the active file magical array to simplify 2620 # the code here. 2621 local (*dbline) = $main::{ '_<' . $filename }; 2622 2623 # Last line in the program. 2624 $max = $#dbline; 2625 2626 # The &-call is here to ascertain the mutability of @_. 2627 &_DB__determine_if_we_should_break; 2628 2629 # Preserve the current stop-or-not, and see if any of the W 2630 # (watch expressions) has changed. 2631 my $was_signal = $signal; 2632 2633 # If we have any watch expressions ... 2634 _DB__handle_watch_expressions($obj); 2635 2636=head2 C<watchfunction()> 2637 2638C<watchfunction()> is a function that can be defined by the user; it is a 2639function which will be run on each entry to C<DB::DB>; it gets the 2640current package, filename, and line as its parameters. 2641 2642The watchfunction can do anything it likes; it is executing in the 2643debugger's context, so it has access to all of the debugger's internal 2644data structures and functions. 2645 2646C<watchfunction()> can control the debugger's actions. Any of the following 2647will cause the debugger to return control to the user's program after 2648C<watchfunction()> executes: 2649 2650=over 4 2651 2652=item * 2653 2654Returning a false value from the C<watchfunction()> itself. 2655 2656=item * 2657 2658Altering C<$single> to a false value. 2659 2660=item * 2661 2662Altering C<$signal> to a false value. 2663 2664=item * 2665 2666Turning off the C<4> bit in C<$trace> (this also disables the 2667check for C<watchfunction()>. This can be done with 2668 2669 $trace &= ~4; 2670 2671=back 2672 2673=cut 2674 2675 # If there's a user-defined DB::watchfunction, call it with the 2676 # current package, filename, and line. The function executes in 2677 # the DB:: package. 2678 if ( $trace & 4 ) { # User-installed watch 2679 return 2680 if watchfunction( $package, $filename, $line ) 2681 and not $single 2682 and not $was_signal 2683 and not( $trace & ~4 ); 2684 } ## end if ($trace & 4) 2685 2686 # Pick up any alteration to $signal in the watchfunction, and 2687 # turn off the signal now. 2688 $was_signal = $signal; 2689 $signal = 0; 2690 2691=head2 GETTING READY TO EXECUTE COMMANDS 2692 2693The debugger decides to take control if single-step mode is on, the 2694C<t> command was entered, or the user generated a signal. If the program 2695has fallen off the end, we set things up so that entering further commands 2696won't cause trouble, and we say that the program is over. 2697 2698=cut 2699 2700 # Make sure that we always print if asked for explicitly regardless 2701 # of $trace_to_depth . 2702 $explicit_stop = ($single || $was_signal); 2703 2704 # Check to see if we should grab control ($single true, 2705 # trace set appropriately, or we got a signal). 2706 if ( $explicit_stop || ( $trace & 1 ) ) { 2707 $obj->_DB__grab_control(@_); 2708 } ## end if ($single || ($trace... 2709 2710=pod 2711 2712If there's an action to be executed for the line we stopped at, execute it. 2713If there are any preprompt actions, execute those as well. 2714 2715=cut 2716 2717 # If there's an action, do it now. 2718 if ($action) { 2719 $evalarg = $action; 2720 # The &-call is here to ascertain the mutability of @_. 2721 &DB::eval; 2722 } 2723 2724 # Are we nested another level (e.g., did we evaluate a function 2725 # that had a breakpoint in it at the debugger prompt)? 2726 if ( $single || $was_signal ) { 2727 2728 # Yes, go down a level. 2729 local $level = $level + 1; 2730 2731 # Do any pre-prompt actions. 2732 foreach $evalarg (@$pre) { 2733 # The &-call is here to ascertain the mutability of @_. 2734 &DB::eval; 2735 } 2736 2737 # Complain about too much recursion if we passed the limit. 2738 if ($single & 4) { 2739 print $OUT $stack_depth . " levels deep in subroutine calls!\n"; 2740 } 2741 2742 # The line we're currently on. Set $incr to -1 to stay here 2743 # until we get a command that tells us to advance. 2744 $start = $line; 2745 $incr = -1; # for backward motion. 2746 2747 # Tack preprompt debugger actions ahead of any actual input. 2748 @typeahead = ( @$pretype, @typeahead ); 2749 2750=head2 WHERE ARE WE? 2751 2752XXX Relocate this section? 2753 2754The debugger normally shows the line corresponding to the current line of 2755execution. Sometimes, though, we want to see the next line, or to move elsewhere 2756in the file. This is done via the C<$incr>, C<$start>, and C<$max> variables. 2757 2758C<$incr> controls by how many lines the I<current> line should move forward 2759after a command is executed. If set to -1, this indicates that the I<current> 2760line shouldn't change. 2761 2762C<$start> is the I<current> line. It is used for things like knowing where to 2763move forwards or backwards from when doing an C<L> or C<-> command. 2764 2765C<$max> tells the debugger where the last line of the current file is. It's 2766used to terminate loops most often. 2767 2768=head2 THE COMMAND LOOP 2769 2770Most of C<DB::DB> is actually a command parsing and dispatch loop. It comes 2771in two parts: 2772 2773=over 4 2774 2775=item * 2776 2777The outer part of the loop, starting at the C<CMD> label. This loop 2778reads a command and then executes it. 2779 2780=item * 2781 2782The inner part of the loop, starting at the C<PIPE> label. This part 2783is wholly contained inside the C<CMD> block and only executes a command. 2784Used to handle commands running inside a pager. 2785 2786=back 2787 2788So why have two labels to restart the loop? Because sometimes, it's easier to 2789have a command I<generate> another command and then re-execute the loop to do 2790the new command. This is faster, but perhaps a bit more convoluted. 2791 2792=cut 2793 2794 # The big command dispatch loop. It keeps running until the 2795 # user yields up control again. 2796 # 2797 # If we have a terminal for input, and we get something back 2798 # from readline(), keep on processing. 2799 2800 CMD: 2801 while (_DB__read_next_cmd($tid)) 2802 { 2803 2804 share($cmd); 2805 # ... try to execute the input as debugger commands. 2806 2807 # Don't stop running. 2808 $single = 0; 2809 2810 # No signal is active. 2811 $signal = 0; 2812 2813 # Handle continued commands (ending with \): 2814 if ($cmd =~ s/\\\z/\n/) { 2815 $cmd .= DB::readline(" cont: "); 2816 redo CMD; 2817 } 2818 2819=head4 The null command 2820 2821A newline entered by itself means I<re-execute the last command>. We grab the 2822command out of C<$laststep> (where it was recorded previously), and copy it 2823back into C<$cmd> to be executed below. If there wasn't any previous command, 2824we'll do nothing below (no command will match). If there was, we also save it 2825in the command history and fall through to allow the command parsing to pick 2826it up. 2827 2828=cut 2829 2830 # Empty input means repeat the last command. 2831 if ($cmd eq '') { 2832 $cmd = $laststep; 2833 } 2834 chomp($cmd); # get rid of the annoying extra newline 2835 if (length($cmd) >= 2) { 2836 push( @hist, $cmd ); 2837 } 2838 push( @truehist, $cmd ); 2839 share(@hist); 2840 share(@truehist); 2841 2842 # This is a restart point for commands that didn't arrive 2843 # via direct user input. It allows us to 'redo PIPE' to 2844 # re-execute command processing without reading a new command. 2845 PIPE: { 2846 _DB__trim_command_and_return_first_component($obj); 2847 2848=head3 COMMAND ALIASES 2849 2850The debugger can create aliases for commands (these are stored in the 2851C<%alias> hash). Before a command is executed, the command loop looks it up 2852in the alias hash and substitutes the contents of the alias for the command, 2853completely replacing it. 2854 2855=cut 2856 2857 # See if there's an alias for the command, and set it up if so. 2858 if ( $alias{$cmd_verb} ) { 2859 2860 # Squelch signal handling; we want to keep control here 2861 # if something goes loco during the alias eval. 2862 local $SIG{__DIE__}; 2863 local $SIG{__WARN__}; 2864 2865 # This is a command, so we eval it in the DEBUGGER's 2866 # scope! Otherwise, we can't see the special debugger 2867 # variables, or get to the debugger's subs. (Well, we 2868 # _could_, but why make it even more complicated?) 2869 eval "\$cmd =~ $alias{$cmd_verb}"; 2870 if ($@) { 2871 local $\ = ''; 2872 print $OUT "Couldn't evaluate '$cmd_verb' alias: $@"; 2873 next CMD; 2874 } 2875 _DB__trim_command_and_return_first_component($obj); 2876 } ## end if ($alias{$cmd_verb}) 2877 2878=head3 MAIN-LINE COMMANDS 2879 2880All of these commands work up to and after the program being debugged has 2881terminated. 2882 2883=head4 C<q> - quit 2884 2885Quit the debugger. This entails setting the C<$fall_off_end> flag, so we don't 2886try to execute further, cleaning any restart-related stuff out of the 2887environment, and executing with the last value of C<$?>. 2888 2889=cut 2890 2891 # All of these commands were remapped in perl 5.8.0; 2892 # we send them off to the secondary dispatcher (see below). 2893 $obj->_handle_special_char_cmd_wrapper_commands; 2894 _DB__trim_command_and_return_first_component($obj); 2895 2896 if (my $cmd_rec = $cmd_lookup{$cmd_verb}) { 2897 my $type = $cmd_rec->{t}; 2898 my $val = $cmd_rec->{v}; 2899 if ($type eq 'm') { 2900 $obj->$val(); 2901 } 2902 elsif ($type eq 's') { 2903 $val->($obj); 2904 } 2905 } 2906 2907=head4 C<t> - trace [n] 2908 2909Turn tracing on or off. Inverts the appropriate bit in C<$trace> (q.v.). 2910If level is specified, set C<$trace_to_depth>. 2911 2912=head4 C<S> - list subroutines matching/not matching a pattern 2913 2914Walks through C<%sub>, checking to see whether or not to print the name. 2915 2916=head4 C<X> - list variables in current package 2917 2918Since the C<V> command actually processes this, just change this to the 2919appropriate C<V> command and fall through. 2920 2921=head4 C<V> - list variables 2922 2923Uses C<dumpvar.pl> to dump out the current values for selected variables. 2924 2925=head4 C<x> - evaluate and print an expression 2926 2927Hands the expression off to C<DB::eval>, setting it up to print the value 2928via C<dumpvar.pl> instead of just printing it directly. 2929 2930=head4 C<m> - print methods 2931 2932Just uses C<DB::methods> to determine what methods are available. 2933 2934=head4 C<f> - switch files 2935 2936Switch to a different filename. 2937 2938=head4 C<.> - return to last-executed line. 2939 2940We set C<$incr> to -1 to indicate that the debugger shouldn't move ahead, 2941and then we look up the line in the magical C<%dbline> hash. 2942 2943=head4 C<-> - back one window 2944 2945We change C<$start> to be one window back; if we go back past the first line, 2946we set it to be the first line. We set C<$incr> to put us back at the 2947currently-executing line, and then put a C<l $start +> (list one window from 2948C<$start>) in C<$cmd> to be executed later. 2949 2950=head3 PRE-580 COMMANDS VS. NEW COMMANDS: C<a, A, b, B, h, l, L, M, o, O, P, v, w, W, E<lt>, E<lt>E<lt>, E<0x7B>, E<0x7B>E<0x7B>> 2951 2952In Perl 5.8.0, a realignment of the commands was done to fix up a number of 2953problems, most notably that the default case of several commands destroying 2954the user's work in setting watchpoints, actions, etc. We wanted, however, to 2955retain the old commands for those who were used to using them or who preferred 2956them. At this point, we check for the new commands and call C<cmd_wrapper> to 2957deal with them instead of processing them in-line. 2958 2959=head4 C<y> - List lexicals in higher scope 2960 2961Uses C<PadWalker> to find the lexicals supplied as arguments in a scope 2962above the current one and then displays then using C<dumpvar.pl>. 2963 2964=head3 COMMANDS NOT WORKING AFTER PROGRAM ENDS 2965 2966All of the commands below this point don't work after the program being 2967debugged has ended. All of them check to see if the program has ended; this 2968allows the commands to be relocated without worrying about a 'line of 2969demarcation' above which commands can be entered anytime, and below which 2970they can't. 2971 2972=head4 C<n> - single step, but don't trace down into subs 2973 2974Done by setting C<$single> to 2, which forces subs to execute straight through 2975when entered (see C<DB::sub>). We also save the C<n> command in C<$laststep>, 2976so a null command knows what to re-execute. 2977 2978=head4 C<s> - single-step, entering subs 2979 2980Sets C<$single> to 1, which causes C<DB::sub> to continue tracing inside 2981subs. Also saves C<s> as C<$lastcmd>. 2982 2983=head4 C<c> - run continuously, setting an optional breakpoint 2984 2985Most of the code for this command is taken up with locating the optional 2986breakpoint, which is either a subroutine name or a line number. We set 2987the appropriate one-time-break in C<@dbline> and then turn off single-stepping 2988in this and all call levels above this one. 2989 2990=head4 C<r> - return from a subroutine 2991 2992For C<r> to work properly, the debugger has to stop execution again 2993immediately after the return is executed. This is done by forcing 2994single-stepping to be on in the call level above the current one. If 2995we are printing return values when a C<r> is executed, set C<$doret> 2996appropriately, and force us out of the command loop. 2997 2998=head4 C<T> - stack trace 2999 3000Just calls C<DB::print_trace>. 3001 3002=head4 C<w> - List window around current line. 3003 3004Just calls C<DB::cmd_w>. 3005 3006=head4 C<W> - watch-expression processing. 3007 3008Just calls C<DB::cmd_W>. 3009 3010=head4 C</> - search forward for a string in the source 3011 3012We take the argument and treat it as a pattern. If it turns out to be a 3013bad one, we return the error we got from trying to C<eval> it and exit. 3014If not, we create some code to do the search and C<eval> it so it can't 3015mess us up. 3016 3017=cut 3018 3019 _DB__handle_forward_slash_command($obj); 3020 3021=head4 C<?> - search backward for a string in the source 3022 3023Same as for C</>, except the loop runs backwards. 3024 3025=cut 3026 3027 _DB__handle_question_mark_command($obj); 3028 3029=head4 C<$rc> - Recall command 3030 3031Manages the commands in C<@hist> (which is created if C<Term::ReadLine> reports 3032that the terminal supports history). It finds the command required, puts it 3033into C<$cmd>, and redoes the loop to execute it. 3034 3035=cut 3036 3037 # $rc - recall command. 3038 $obj->_handle_rc_recall_command; 3039 3040=head4 C<$sh$sh> - C<system()> command 3041 3042Calls the C<_db_system()> to handle the command. This keeps the C<STDIN> and 3043C<STDOUT> from getting messed up. 3044 3045=cut 3046 3047 $obj->_handle_sh_command; 3048 3049=head4 C<$rc I<pattern> $rc> - Search command history 3050 3051Another command to manipulate C<@hist>: this one searches it with a pattern. 3052If a command is found, it is placed in C<$cmd> and executed via C<redo>. 3053 3054=cut 3055 3056 $obj->_handle_rc_search_history_command; 3057 3058=head4 C<$sh> - Invoke a shell 3059 3060Uses C<_db_system()> to invoke a shell. 3061 3062=cut 3063 3064=head4 C<$sh I<command>> - Force execution of a command in a shell 3065 3066Like the above, but the command is passed to the shell. Again, we use 3067C<_db_system()> to avoid problems with C<STDIN> and C<STDOUT>. 3068 3069=head4 C<H> - display commands in history 3070 3071Prints the contents of C<@hist> (if any). 3072 3073=head4 C<man, doc, perldoc> - look up documentation 3074 3075Just calls C<runman()> to print the appropriate document. 3076 3077=cut 3078 3079 $obj->_handle_doc_command; 3080 3081=head4 C<p> - print 3082 3083Builds a C<print EXPR> expression in the C<$cmd>; this will get executed at 3084the bottom of the loop. 3085 3086=head4 C<=> - define command alias 3087 3088Manipulates C<%alias> to add or list command aliases. 3089 3090=head4 C<source> - read commands from a file. 3091 3092Opens a lexical filehandle and stacks it on C<@cmdfhs>; C<DB::readline> will 3093pick it up. 3094 3095=head4 C<enable> C<disable> - enable or disable breakpoints 3096 3097This enables or disables breakpoints. 3098 3099=head4 C<save> - send current history to a file 3100 3101Takes the complete history, (not the shrunken version you see with C<H>), 3102and saves it to the given filename, so it can be replayed using C<source>. 3103 3104Note that all C<^(save|source)>'s are commented out with a view to minimise recursion. 3105 3106=head4 C<R> - restart 3107 3108Restart the debugger session. 3109 3110=head4 C<rerun> - rerun the current session 3111 3112Return to any given position in the B<true>-history list 3113 3114=head4 C<|, ||> - pipe output through the pager. 3115 3116For C<|>, we save C<OUT> (the debugger's output filehandle) and C<STDOUT> 3117(the program's standard output). For C<||>, we only save C<OUT>. We open a 3118pipe to the pager (restoring the output filehandles if this fails). If this 3119is the C<|> command, we also set up a C<SIGPIPE> handler which will simply 3120set C<$signal>, sending us back into the debugger. 3121 3122We then trim off the pipe symbols and C<redo> the command loop at the 3123C<PIPE> label, causing us to evaluate the command in C<$cmd> without 3124reading another. 3125 3126=cut 3127 3128 # || - run command in the pager, with output to DB::OUT. 3129 _DB__handle_run_command_in_pager_command($obj); 3130 3131=head3 END OF COMMAND PARSING 3132 3133Anything left in C<$cmd> at this point is a Perl expression that we want to 3134evaluate. We'll always evaluate in the user's context, and fully qualify 3135any variables we might want to address in the C<DB> package. 3136 3137=cut 3138 3139 } # PIPE: 3140 3141 # trace an expression 3142 $cmd =~ s/^t\s/\$DB::trace |= 1;\n/; 3143 3144 # Make sure the flag that says "the debugger's running" is 3145 # still on, to make sure we get control again. 3146 $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd"; 3147 3148 # Run *our* eval that executes in the caller's context. 3149 # The &-call is here to ascertain the mutability of @_. 3150 &DB::eval; 3151 3152 # Turn off the one-time-dump stuff now. 3153 if ($onetimeDump) { 3154 $onetimeDump = undef; 3155 $onetimedumpDepth = undef; 3156 } 3157 elsif ( $term_pid == $$ ) { 3158 eval { # May run under miniperl, when not available... 3159 STDOUT->flush(); 3160 STDERR->flush(); 3161 }; 3162 3163 # XXX If this is the master pid, print a newline. 3164 print {$OUT} "\n"; 3165 } 3166 } ## end while (($term || &setterm... 3167 3168=head3 POST-COMMAND PROCESSING 3169 3170After each command, we check to see if the command output was piped anywhere. 3171If so, we go through the necessary code to unhook the pipe and go back to 3172our standard filehandles for input and output. 3173 3174=cut 3175 3176 continue { # CMD: 3177 _DB__at_end_of_every_command($obj); 3178 } # CMD: 3179 3180=head3 COMMAND LOOP TERMINATION 3181 3182When commands have finished executing, we come here. If the user closed the 3183input filehandle, we turn on C<$fall_off_end> to emulate a C<q> command. We 3184evaluate any post-prompt items. We restore C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, 3185C<$\>, and C<$^W>, and return a null list as expected by the Perl interpreter. 3186The interpreter will then execute the next line and then return control to us 3187again. 3188 3189=cut 3190 3191 # No more commands? Quit. 3192 $fall_off_end = 1 unless defined $cmd; # Emulate 'q' on EOF 3193 3194 # Evaluate post-prompt commands. 3195 foreach $evalarg (@$post) { 3196 # The &-call is here to ascertain the mutability of @_. 3197 &DB::eval; 3198 } 3199 } # if ($single || $signal) 3200 3201 # Put the user's globals back where you found them. 3202 ( $@, $!, $^E, $,, $/, $\, $^W ) = @saved; 3203 (); 3204} ## end sub DB 3205 3206# Because DB::Obj is used above, 3207# 3208# my $obj = DB::Obj->new( 3209# 3210# The following package declaration must come before that, 3211# or else runtime errors will occur with 3212# 3213# PERLDB_OPTS="autotrace nonstop" 3214# 3215# ( rt#116771 ) 3216BEGIN { 3217 3218package DB::Obj; 3219 3220sub new { 3221 my $class = shift; 3222 3223 my $self = bless {}, $class; 3224 3225 $self->_init(@_); 3226 3227 return $self; 3228} 3229 3230sub _init { 3231 my ($self, $args) = @_; 3232 3233 %{$self} = (%$self, %$args); 3234 3235 return; 3236} 3237 3238{ 3239 no strict 'refs'; 3240 foreach my $slot_name (qw( 3241 after explicit_stop infix pat piped position prefix selected cmd_verb 3242 cmd_args 3243 )) { 3244 my $slot = $slot_name; 3245 *{$slot} = sub { 3246 my $self = shift; 3247 3248 if (@_) { 3249 ${ $self->{$slot} } = shift; 3250 } 3251 3252 return ${ $self->{$slot} }; 3253 }; 3254 3255 *{"append_to_$slot"} = sub { 3256 my $self = shift; 3257 my $s = shift; 3258 3259 return $self->$slot($self->$slot . $s); 3260 }; 3261 } 3262} 3263 3264sub _DB_on_init__initialize_globals 3265{ 3266 my $self = shift; 3267 3268 # Check for whether we should be running continuously or not. 3269 # _After_ the perl program is compiled, $single is set to 1: 3270 if ( $single and not $second_time++ ) { 3271 3272 # Options say run non-stop. Run until we get an interrupt. 3273 if ($runnonstop) { # Disable until signal 3274 # If there's any call stack in place, turn off single 3275 # stepping into subs throughout the stack. 3276 for my $i (0 .. $stack_depth) { 3277 $stack[ $i ] &= ~1; 3278 } 3279 3280 # And we are now no longer in single-step mode. 3281 $single = 0; 3282 3283 # If we simply returned at this point, we wouldn't get 3284 # the trace info. Fall on through. 3285 # return; 3286 } ## end if ($runnonstop) 3287 3288 elsif ($ImmediateStop) { 3289 3290 # We are supposed to stop here; XXX probably a break. 3291 $ImmediateStop = 0; # We've processed it; turn it off 3292 $signal = 1; # Simulate an interrupt to force 3293 # us into the command loop 3294 } 3295 } ## end if ($single and not $second_time... 3296 3297 # If we're in single-step mode, or an interrupt (real or fake) 3298 # has occurred, turn off non-stop mode. 3299 $runnonstop = 0 if $single or $signal; 3300 3301 return; 3302} 3303 3304sub _my_print_lineinfo 3305{ 3306 my ($self, $i, $incr_pos) = @_; 3307 3308 if ($frame) { 3309 # Print it indented if tracing is on. 3310 DB::print_lineinfo( ' ' x $stack_depth, 3311 "$i:\t$DB::dbline[$i]" . $self->after ); 3312 } 3313 else { 3314 DB::depth_print_lineinfo($self->explicit_stop, $incr_pos); 3315 } 3316} 3317 3318sub _curr_line { 3319 return $DB::dbline[$line]; 3320} 3321 3322sub _is_full { 3323 my ($self, $letter) = @_; 3324 3325 return ($DB::cmd eq $letter); 3326} 3327 3328sub _DB__grab_control 3329{ 3330 my $self = shift; 3331 3332 # Yes, grab control. 3333 if ($slave_editor) { 3334 3335 # Tell the editor to update its position. 3336 $self->position("\032\032${DB::filename}:$line:0\n"); 3337 DB::print_lineinfo($self->position()); 3338 } 3339 3340=pod 3341 3342Special check: if we're in package C<DB::fake>, we've gone through the 3343C<END> block at least once. We set up everything so that we can continue 3344to enter commands and have a valid context to be in. 3345 3346=cut 3347 3348 elsif ( $DB::package eq 'DB::fake' ) { 3349 3350 # Fallen off the end already. 3351 if (!$DB::term) { 3352 DB::setterm(); 3353 } 3354 3355 DB::print_help(<<EOP); 3356Debugged program terminated. Use B<q> to quit or B<R> to restart, 3357use B<o> I<inhibit_exit> to avoid stopping after program termination, 3358B<h q>, B<h R> or B<h o> to get additional info. 3359EOP 3360 3361 # Set the DB::eval context appropriately. 3362 # At program termination disable any user actions. 3363 $DB::action = undef; 3364 3365 $DB::package = 'main'; 3366 $DB::usercontext = DB::_calc_usercontext($DB::package); 3367 } ## end elsif ($package eq 'DB::fake') 3368 3369=pod 3370 3371If the program hasn't finished executing, we scan forward to the 3372next executable line, print that out, build the prompt from the file and line 3373number information, and print that. 3374 3375=cut 3376 3377 else { 3378 3379 3380 # Still somewhere in the midst of execution. Set up the 3381 # debugger prompt. 3382 $DB::sub =~ s/\'/::/; # Swap Perl 4 package separators (') to 3383 # Perl 5 ones (sorry, we don't print Klingon 3384 #module names) 3385 3386 $self->prefix($DB::sub =~ /::/ ? "" : ($DB::package . '::')); 3387 $self->append_to_prefix( "$DB::sub(${DB::filename}:" ); 3388 $self->after( $self->_curr_line =~ /\n$/ ? '' : "\n" ); 3389 3390 # Break up the prompt if it's really long. 3391 if ( length($self->prefix()) > 30 ) { 3392 $self->position($self->prefix . "$line):\n$line:\t" . $self->_curr_line . $self->after); 3393 $self->prefix(""); 3394 $self->infix(":\t"); 3395 } 3396 else { 3397 $self->infix("):\t"); 3398 $self->position( 3399 $self->prefix . $line. $self->infix 3400 . $self->_curr_line . $self->after 3401 ); 3402 } 3403 3404 # Print current line info, indenting if necessary. 3405 $self->_my_print_lineinfo($line, $self->position); 3406 3407 my $i; 3408 my $line_i = sub { return $DB::dbline[$i]; }; 3409 3410 # Scan forward, stopping at either the end or the next 3411 # unbreakable line. 3412 for ( $i = $line + 1 ; $i <= $DB::max && $line_i->() == 0 ; ++$i ) 3413 { #{ vi 3414 3415 # Drop out on null statements, block closers, and comments. 3416 last if $line_i->() =~ /^\s*[\;\}\#\n]/; 3417 3418 # Drop out if the user interrupted us. 3419 last if $signal; 3420 3421 # Append a newline if the line doesn't have one. Can happen 3422 # in eval'ed text, for instance. 3423 $self->after( $line_i->() =~ /\n$/ ? '' : "\n" ); 3424 3425 # Next executable line. 3426 my $incr_pos = $self->prefix . $i . $self->infix . $line_i->() 3427 . $self->after; 3428 $self->append_to_position($incr_pos); 3429 $self->_my_print_lineinfo($i, $incr_pos); 3430 } ## end for ($i = $line + 1 ; $i... 3431 } ## end else [ if ($slave_editor) 3432 3433 return; 3434} 3435 3436sub _handle_t_command { 3437 my $self = shift; 3438 3439 my $levels = $self->cmd_args(); 3440 3441 if ((!length($levels)) or ($levels !~ /\D/)) { 3442 $trace ^= 1; 3443 local $\ = ''; 3444 $DB::trace_to_depth = $levels ? $stack_depth + $levels : 1E9; 3445 print {$OUT} "Trace = " 3446 . ( ( $trace & 1 ) 3447 ? ( $levels ? "on (to level $DB::trace_to_depth)" : "on" ) 3448 : "off" ) . "\n"; 3449 next CMD; 3450 } 3451 3452 return; 3453} 3454 3455 3456sub _handle_S_command { 3457 my $self = shift; 3458 3459 if (my ($print_all_subs, $should_reverse, $Spatt) 3460 = $self->cmd_args =~ /\A((!)?(.+))?\z/) { 3461 # $Spatt is the pattern (if any) to use. 3462 # Reverse scan? 3463 my $Srev = defined $should_reverse; 3464 # No args - print all subs. 3465 my $Snocheck = !defined $print_all_subs; 3466 3467 # Need to make these sane here. 3468 local $\ = ''; 3469 local $, = ''; 3470 3471 # Search through the debugger's magical hash of subs. 3472 # If $nocheck is true, just print the sub name. 3473 # Otherwise, check it against the pattern. We then use 3474 # the XOR trick to reverse the condition as required. 3475 foreach $subname ( sort( keys %sub ) ) { 3476 if ( $Snocheck or $Srev ^ ( $subname =~ /$Spatt/ ) ) { 3477 print $OUT $subname, "\n"; 3478 } 3479 } 3480 next CMD; 3481 } 3482 3483 return; 3484} 3485 3486sub _handle_V_command_and_X_command { 3487 my $self = shift; 3488 3489 $DB::cmd =~ s/^X\b/V $DB::package/; 3490 3491 # Bare V commands get the currently-being-debugged package 3492 # added. 3493 if ($self->_is_full('V')) { 3494 $DB::cmd = "V $DB::package"; 3495 } 3496 3497 # V - show variables in package. 3498 if (my ($new_packname, $new_vars_str) = 3499 $DB::cmd =~ /\AV\b\s*(\S+)\s*(.*)/) { 3500 3501 # Save the currently selected filehandle and 3502 # force output to debugger's filehandle (dumpvar 3503 # just does "print" for output). 3504 my $savout = select($OUT); 3505 3506 # Grab package name and variables to dump. 3507 $packname = $new_packname; 3508 my @vars = split( ' ', $new_vars_str ); 3509 3510 # If main::dumpvar isn't here, get it. 3511 do 'dumpvar.pl' || die $@ unless defined &main::dumpvar; 3512 if ( defined &main::dumpvar ) { 3513 3514 # We got it. Turn off subroutine entry/exit messages 3515 # for the moment, along with return values. 3516 local $frame = 0; 3517 local $doret = -2; 3518 3519 # must detect sigpipe failures - not catching 3520 # then will cause the debugger to die. 3521 eval { 3522 main::dumpvar( 3523 $packname, 3524 defined $option{dumpDepth} 3525 ? $option{dumpDepth} 3526 : -1, # assume -1 unless specified 3527 @vars 3528 ); 3529 }; 3530 3531 # The die doesn't need to include the $@, because 3532 # it will automatically get propagated for us. 3533 if ($@) { 3534 die unless $@ =~ /dumpvar print failed/; 3535 } 3536 } ## end if (defined &main::dumpvar) 3537 else { 3538 3539 # Couldn't load dumpvar. 3540 print $OUT "dumpvar.pl not available.\n"; 3541 } 3542 3543 # Restore the output filehandle, and go round again. 3544 select($savout); 3545 next CMD; 3546 } 3547 3548 return; 3549} 3550 3551sub _handle_dash_command { 3552 my $self = shift; 3553 3554 if ($self->_is_full('-')) { 3555 3556 # back up by a window; go to 1 if back too far. 3557 $start -= $incr + $window + 1; 3558 $start = 1 if $start <= 0; 3559 $incr = $window - 1; 3560 3561 # Generate and execute a "l +" command (handled below). 3562 $DB::cmd = 'l ' . ($start) . '+'; 3563 redo CMD; 3564 } 3565 return; 3566} 3567 3568sub _n_or_s_commands_generic { 3569 my ($self, $new_val) = @_; 3570 # n - next 3571 next CMD if DB::_DB__is_finished(); 3572 3573 # Single step, but don't enter subs. 3574 $single = $new_val; 3575 3576 # Save for empty command (repeat last). 3577 $laststep = $DB::cmd; 3578 last CMD; 3579} 3580 3581sub _n_or_s { 3582 my ($self, $letter, $new_val) = @_; 3583 3584 if ($self->_is_full($letter)) { 3585 $self->_n_or_s_commands_generic($new_val); 3586 } 3587 else { 3588 $self->_n_or_s_and_arg_commands_generic($letter, $new_val); 3589 } 3590 3591 return; 3592} 3593 3594sub _handle_n_command { 3595 my $self = shift; 3596 3597 return $self->_n_or_s('n', 2); 3598} 3599 3600sub _handle_s_command { 3601 my $self = shift; 3602 3603 return $self->_n_or_s('s', 1); 3604} 3605 3606sub _handle_r_command { 3607 my $self = shift; 3608 3609 # r - return from the current subroutine. 3610 if ($self->_is_full('r')) { 3611 3612 # Can't do anything if the program's over. 3613 next CMD if DB::_DB__is_finished(); 3614 3615 # Turn on stack trace. 3616 $stack[$stack_depth] |= 1; 3617 3618 # Print return value unless the stack is empty. 3619 $doret = $option{PrintRet} ? $stack_depth - 1 : -2; 3620 last CMD; 3621 } 3622 3623 return; 3624} 3625 3626sub _handle_T_command { 3627 my $self = shift; 3628 3629 if ($self->_is_full('T')) { 3630 DB::print_trace( $OUT, 1 ); # skip DB 3631 next CMD; 3632 } 3633 3634 return; 3635} 3636 3637sub _handle_w_command { 3638 my $self = shift; 3639 3640 DB::cmd_w( 'w', $self->cmd_args() ); 3641 next CMD; 3642 3643 return; 3644} 3645 3646sub _handle_W_command { 3647 my $self = shift; 3648 3649 if (my $arg = $self->cmd_args) { 3650 DB::cmd_W( 'W', $arg ); 3651 next CMD; 3652 } 3653 3654 return; 3655} 3656 3657sub _handle_rc_recall_command { 3658 my $self = shift; 3659 3660 # $rc - recall command. 3661 if (my ($minus, $arg) = $DB::cmd =~ m#\A$rc+\s*(-)?(\d+)?\z#) { 3662 3663 # No arguments, take one thing off history. 3664 pop(@hist) if length($DB::cmd) > 1; 3665 3666 # Relative (- found)? 3667 # Y - index back from most recent (by 1 if bare minus) 3668 # N - go to that particular command slot or the last 3669 # thing if nothing following. 3670 3671 $self->cmd_verb( 3672 scalar($minus ? ( $#hist - ( $arg || 1 ) ) : ( $arg || $#hist )) 3673 ); 3674 3675 # Pick out the command desired. 3676 $DB::cmd = $hist[$self->cmd_verb]; 3677 3678 # Print the command to be executed and restart the loop 3679 # with that command in the buffer. 3680 print {$OUT} $DB::cmd, "\n"; 3681 redo CMD; 3682 } 3683 3684 return; 3685} 3686 3687sub _handle_rc_search_history_command { 3688 my $self = shift; 3689 3690 # $rc pattern $rc - find a command in the history. 3691 if (my ($arg) = $DB::cmd =~ /\A$rc([^$rc].*)\z/) { 3692 3693 # Create the pattern to use. 3694 my $pat = "^$arg"; 3695 $self->pat($pat); 3696 3697 # Toss off last entry if length is >1 (and it always is). 3698 pop(@hist) if length($DB::cmd) > 1; 3699 3700 my $i; 3701 3702 # Look backward through the history. 3703 SEARCH_HIST: 3704 for ( $i = $#hist ; $i ; --$i ) { 3705 # Stop if we find it. 3706 last SEARCH_HIST if $hist[$i] =~ /$pat/; 3707 } 3708 3709 if ( !$i ) { 3710 3711 # Never found it. 3712 print $OUT "No such command!\n\n"; 3713 next CMD; 3714 } 3715 3716 # Found it. Put it in the buffer, print it, and process it. 3717 $DB::cmd = $hist[$i]; 3718 print $OUT $DB::cmd, "\n"; 3719 redo CMD; 3720 } 3721 3722 return; 3723} 3724 3725sub _handle_H_command { 3726 my $self = shift; 3727 3728 if ($self->cmd_args =~ m#\A\*#) { 3729 @hist = @truehist = (); 3730 print $OUT "History cleansed\n"; 3731 next CMD; 3732 } 3733 3734 if (my ($num) = $self->cmd_args =~ /\A(?:-(\d+))?/) { 3735 3736 # Anything other than negative numbers is ignored by 3737 # the (incorrect) pattern, so this test does nothing. 3738 $end = $num ? ( $#hist - $num ) : 0; 3739 3740 # Set to the minimum if less than zero. 3741 $hist = 0 if $hist < 0; 3742 3743 # Start at the end of the array. 3744 # Stay in while we're still above the ending value. 3745 # Tick back by one each time around the loop. 3746 my $i; 3747 3748 for ( $i = $#hist ; $i > $end ; $i-- ) { 3749 3750 # Print the command unless it has no arguments. 3751 print $OUT "$i: ", $hist[$i], "\n" 3752 unless $hist[$i] =~ /^.?$/; 3753 } 3754 3755 next CMD; 3756 } 3757 3758 return; 3759} 3760 3761sub _handle_doc_command { 3762 my $self = shift; 3763 3764 # man, perldoc, doc - show manual pages. 3765 if (my ($man_page) 3766 = $DB::cmd =~ /\A(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?\z/) { 3767 DB::runman($man_page); 3768 next CMD; 3769 } 3770 3771 return; 3772} 3773 3774sub _handle_p_command { 3775 my $self = shift; 3776 3777 my $print_cmd = 'print {$DB::OUT} '; 3778 # p - print (no args): print $_. 3779 if ($self->_is_full('p')) { 3780 $DB::cmd = $print_cmd . '$_'; 3781 } 3782 else { 3783 # p - print the given expression. 3784 $DB::cmd =~ s/\Ap\b/$print_cmd /; 3785 } 3786 3787 return; 3788} 3789 3790sub _handle_equal_sign_command { 3791 my $self = shift; 3792 3793 if ($DB::cmd =~ s/\A=\s*//) { 3794 my @keys; 3795 if ( length $DB::cmd == 0 ) { 3796 3797 # No args, get current aliases. 3798 @keys = sort keys %alias; 3799 } 3800 elsif ( my ( $k, $v ) = ( $DB::cmd =~ /^(\S+)\s+(\S.*)/ ) ) { 3801 3802 # Creating a new alias. $k is alias name, $v is 3803 # alias value. 3804 3805 # can't use $_ or kill //g state 3806 for my $x ( $k, $v ) { 3807 3808 # Escape "alarm" characters. 3809 $x =~ s/\a/\\a/g; 3810 } 3811 3812 # Substitute key for value, using alarm chars 3813 # as separators (which is why we escaped them in 3814 # the command). 3815 $alias{$k} = "s\a$k\a$v\a"; 3816 3817 # Turn off standard warn and die behavior. 3818 local $SIG{__DIE__}; 3819 local $SIG{__WARN__}; 3820 3821 # Is it valid Perl? 3822 unless ( eval "sub { s\a$k\a$v\a }; 1" ) { 3823 3824 # Nope. Bad alias. Say so and get out. 3825 print $OUT "Can't alias $k to $v: $@\n"; 3826 delete $alias{$k}; 3827 next CMD; 3828 } 3829 3830 # We'll only list the new one. 3831 @keys = ($k); 3832 } ## end elsif (my ($k, $v) = ($DB::cmd... 3833 3834 # The argument is the alias to list. 3835 else { 3836 @keys = ($DB::cmd); 3837 } 3838 3839 # List aliases. 3840 for my $k (@keys) { 3841 3842 # Messy metaquoting: Trim the substitution code off. 3843 # We use control-G as the delimiter because it's not 3844 # likely to appear in the alias. 3845 if ( ( my $v = $alias{$k} ) =~ ss\a$k\a(.*)\a$1 ) { 3846 3847 # Print the alias. 3848 print $OUT "$k\t= $1\n"; 3849 } 3850 elsif ( defined $alias{$k} ) { 3851 3852 # Couldn't trim it off; just print the alias code. 3853 print $OUT "$k\t$alias{$k}\n"; 3854 } 3855 else { 3856 3857 # No such, dude. 3858 print "No alias for $k\n"; 3859 } 3860 } ## end for my $k (@keys) 3861 next CMD; 3862 } 3863 3864 return; 3865} 3866 3867sub _handle_source_command { 3868 my $self = shift; 3869 3870 # source - read commands from a file (or pipe!) and execute. 3871 if (my $sourced_fn = $self->cmd_args) { 3872 if ( open my $fh, $sourced_fn ) { 3873 3874 # Opened OK; stick it in the list of file handles. 3875 push @cmdfhs, $fh; 3876 } 3877 else { 3878 3879 # Couldn't open it. 3880 DB::_db_warn("Can't execute '$sourced_fn': $!\n"); 3881 } 3882 next CMD; 3883 } 3884 3885 return; 3886} 3887 3888sub _handle_enable_disable_commands { 3889 my $self = shift; 3890 3891 my $which_cmd = $self->cmd_verb; 3892 my $position = $self->cmd_args; 3893 3894 if ($position !~ /\s/) { 3895 my ($fn, $line_num); 3896 if ($position =~ m{\A\d+\z}) 3897 { 3898 $fn = $DB::filename; 3899 $line_num = $position; 3900 } 3901 elsif (my ($new_fn, $new_line_num) 3902 = $position =~ m{\A(.*):(\d+)\z}) { 3903 ($fn, $line_num) = ($new_fn, $new_line_num); 3904 } 3905 else 3906 { 3907 DB::_db_warn("Wrong spec for enable/disable argument.\n"); 3908 } 3909 3910 if (defined($fn)) { 3911 if (DB::_has_breakpoint_data_ref($fn, $line_num)) { 3912 DB::_set_breakpoint_enabled_status($fn, $line_num, 3913 ($which_cmd eq 'enable' ? 1 : '') 3914 ); 3915 } 3916 else { 3917 DB::_db_warn("No breakpoint set at ${fn}:${line_num}\n"); 3918 } 3919 } 3920 3921 next CMD; 3922 } 3923 3924 return; 3925} 3926 3927sub _handle_save_command { 3928 my $self = shift; 3929 3930 if (my $new_fn = $self->cmd_args) { 3931 my $filename = $new_fn || '.perl5dbrc'; # default? 3932 if ( open my $fh, '>', $filename ) { 3933 3934 # chomp to remove extraneous newlines from source'd files 3935 chomp( my @truelist = 3936 map { m/\A\s*(save|source)/ ? "#$_" : $_ } 3937 @truehist ); 3938 print {$fh} join( "\n", @truelist ); 3939 print "commands saved in $filename\n"; 3940 } 3941 else { 3942 DB::_db_warn("Can't save debugger commands in '$new_fn': $!\n"); 3943 } 3944 next CMD; 3945 } 3946 3947 return; 3948} 3949 3950sub _n_or_s_and_arg_commands_generic { 3951 my ($self, $letter, $new_val) = @_; 3952 3953 # s - single-step. Remember the last command was 's'. 3954 if ($DB::cmd =~ s#\A\Q$letter\E\s#\$DB::single = $new_val;\n#) { 3955 $laststep = $letter; 3956 } 3957 3958 return; 3959} 3960 3961sub _handle_sh_command { 3962 my $self = shift; 3963 3964 # $sh$sh - run a shell command (if it's all ASCII). 3965 # Can't run shell commands with Unicode in the debugger, hmm. 3966 my $my_cmd = $DB::cmd; 3967 if ($my_cmd =~ m#\A$sh#gms) { 3968 3969 if ($my_cmd =~ m#\G\z#cgms) { 3970 # Run the user's shell. If none defined, run Bourne. 3971 # We resume execution when the shell terminates. 3972 DB::_db_system( $ENV{SHELL} || "/bin/sh" ); 3973 next CMD; 3974 } 3975 elsif ($my_cmd =~ m#\G$sh\s*(.*)#cgms) { 3976 # System it. 3977 DB::_db_system($1); 3978 next CMD; 3979 } 3980 elsif ($my_cmd =~ m#\G\s*(.*)#cgms) { 3981 DB::_db_system( $ENV{SHELL} || "/bin/sh", "-c", $1 ); 3982 next CMD; 3983 } 3984 } 3985} 3986 3987sub _handle_x_command { 3988 my $self = shift; 3989 3990 if ($DB::cmd =~ s#\Ax\b# #) { # Remainder gets done by DB::eval() 3991 $onetimeDump = 'dump'; # main::dumpvar shows the output 3992 3993 # handle special "x 3 blah" syntax XXX propagate 3994 # doc back to special variables. 3995 if ( $DB::cmd =~ s#\A\s*(\d+)(?=\s)# #) { 3996 $onetimedumpDepth = $1; 3997 } 3998 } 3999 4000 return; 4001} 4002 4003sub _handle_q_command { 4004 my $self = shift; 4005 4006 if ($self->_is_full('q')) { 4007 $fall_off_end = 1; 4008 DB::clean_ENV(); 4009 exit $?; 4010 } 4011 4012 return; 4013} 4014 4015sub _handle_cmd_wrapper_commands { 4016 my $self = shift; 4017 4018 DB::cmd_wrapper( $self->cmd_verb, $self->cmd_args, $line ); 4019 next CMD; 4020} 4021 4022sub _handle_special_char_cmd_wrapper_commands { 4023 my $self = shift; 4024 4025 # All of these commands were remapped in perl 5.8.0; 4026 # we send them off to the secondary dispatcher (see below). 4027 if (my ($cmd_letter, $my_arg) = $DB::cmd =~ /\A([<>\{]{1,2})\s*(.*)/so) { 4028 DB::cmd_wrapper( $cmd_letter, $my_arg, $line ); 4029 next CMD; 4030 } 4031 4032 return; 4033} 4034 4035} ## end DB::Obj 4036 4037package DB; 4038 4039# The following code may be executed now: 4040# BEGIN {warn 4} 4041 4042=head2 sub 4043 4044C<sub> is called whenever a subroutine call happens in the program being 4045debugged. The variable C<$DB::sub> contains the name of the subroutine 4046being called. 4047 4048The core function of this subroutine is to actually call the sub in the proper 4049context, capturing its output. This of course causes C<DB::DB> to get called 4050again, repeating until the subroutine ends and returns control to C<DB::sub> 4051again. Once control returns, C<DB::sub> figures out whether or not to dump the 4052return value, and returns its captured copy of the return value as its own 4053return value. The value then feeds back into the program being debugged as if 4054C<DB::sub> hadn't been there at all. 4055 4056C<sub> does all the work of printing the subroutine entry and exit messages 4057enabled by setting C<$frame>. It notes what sub the autoloader got called for, 4058and also prints the return value if needed (for the C<r> command and if 4059the 16 bit is set in C<$frame>). 4060 4061It also tracks the subroutine call depth by saving the current setting of 4062C<$single> in the C<@stack> package global; if this exceeds the value in 4063C<$deep>, C<sub> automatically turns on printing of the current depth by 4064setting the C<4> bit in C<$single>. In any case, it keeps the current setting 4065of stop/don't stop on entry to subs set as it currently is set. 4066 4067=head3 C<caller()> support 4068 4069If C<caller()> is called from the package C<DB>, it provides some 4070additional data, in the following order: 4071 4072=over 4 4073 4074=item * C<$package> 4075 4076The package name the sub was in 4077 4078=item * C<$filename> 4079 4080The filename it was defined in 4081 4082=item * C<$line> 4083 4084The line number it was defined on 4085 4086=item * C<$subroutine> 4087 4088The subroutine name; C<(eval)> if an C<eval>(). 4089 4090=item * C<$hasargs> 4091 40921 if it has arguments, 0 if not 4093 4094=item * C<$wantarray> 4095 40961 if array context, 0 if scalar context 4097 4098=item * C<$evaltext> 4099 4100The C<eval>() text, if any (undefined for C<eval BLOCK>) 4101 4102=item * C<$is_require> 4103 4104frame was created by a C<use> or C<require> statement 4105 4106=item * C<$hints> 4107 4108pragma information; subject to change between versions 4109 4110=item * C<$bitmask> 4111 4112pragma information; subject to change between versions 4113 4114=item * C<@DB::args> 4115 4116arguments with which the subroutine was invoked 4117 4118=back 4119 4120=cut 4121 4122use vars qw($deep); 4123 4124# We need to fully qualify the name ("DB::sub") to make "use strict;" 4125# happy. -- Shlomi Fish 4126 4127sub _indent_print_line_info { 4128 my ($offset, $str) = @_; 4129 4130 print_lineinfo( ' ' x ($stack_depth - $offset), $str); 4131 4132 return; 4133} 4134 4135sub _print_frame_message { 4136 my ($al) = @_; 4137 4138 if ($frame) { 4139 if ($frame & 4) { # Extended frame entry message 4140 _indent_print_line_info(-1, "in "); 4141 4142 # Why -1? But it works! :-( 4143 # Because print_trace will call add 1 to it and then call 4144 # dump_trace; this results in our skipping -1+1 = 0 stack frames 4145 # in dump_trace. 4146 # 4147 # Now it's 0 because we extracted a function. 4148 print_trace( $LINEINFO, 0, 1, 1, "$sub$al" ); 4149 } 4150 else { 4151 _indent_print_line_info(-1, "entering $sub$al\n" ); 4152 } 4153 } 4154 4155 return; 4156} 4157 4158sub DB::sub { 4159 my ( $al, $ret, @ret ) = ""; 4160 4161 # We stack the stack pointer and then increment it to protect us 4162 # from a situation that might unwind a whole bunch of call frames 4163 # at once. Localizing the stack pointer means that it will automatically 4164 # unwind the same amount when multiple stack frames are unwound. 4165 local $stack_depth = $stack_depth + 1; # Protect from non-local exits 4166 4167 { 4168 # lock ourselves under threads 4169 # While lock() permits recursive locks, there's two cases where it's bad 4170 # that we keep a hold on the lock while we call the sub: 4171 # - during cloning, Package::CLONE might be called in the context of the new 4172 # thread, which will deadlock if we hold the lock across the threads::new call 4173 # - for any function that waits any significant time 4174 # This also deadlocks if the parent thread joins(), since holding the lock 4175 # will prevent any child threads passing this point. 4176 # So release the lock for the function call. 4177 lock($DBGR); 4178 4179 # Whether or not the autoloader was running, a scalar to put the 4180 # sub's return value in (if needed), and an array to put the sub's 4181 # return value in (if needed). 4182 if ($sub eq 'threads::new' && $ENV{PERL5DB_THREADED}) { 4183 print "creating new thread\n"; 4184 } 4185 4186 # If the last ten characters are '::AUTOLOAD', note we've traced 4187 # into AUTOLOAD for $sub. 4188 if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) { 4189 no strict 'refs'; 4190 $al = " for $$sub" if defined $$sub; 4191 } 4192 4193 # Expand @stack. 4194 $#stack = $stack_depth; 4195 4196 # Save current single-step setting. 4197 $stack[-1] = $single; 4198 4199 # Turn off all flags except single-stepping. 4200 $single &= 1; 4201 4202 # If we've gotten really deeply recursed, turn on the flag that will 4203 # make us stop with the 'deep recursion' message. 4204 $single |= 4 if $stack_depth == $deep; 4205 4206 # If frame messages are on ... 4207 4208 _print_frame_message($al); 4209 } 4210 4211 # Determine the sub's return type, and capture appropriately. 4212 if (wantarray) { 4213 4214 # Called in array context. call sub and capture output. 4215 # DB::DB will recursively get control again if appropriate; we'll come 4216 # back here when the sub is finished. 4217 no strict 'refs'; 4218 @ret = &$sub; 4219 } 4220 elsif ( defined wantarray ) { 4221 no strict 'refs'; 4222 # Save the value if it's wanted at all. 4223 $ret = &$sub; 4224 } 4225 else { 4226 no strict 'refs'; 4227 # Void return, explicitly. 4228 &$sub; 4229 undef $ret; 4230 } 4231 4232 { 4233 lock($DBGR); 4234 4235 # Pop the single-step value back off the stack. 4236 $single |= $stack[ $stack_depth-- ]; 4237 4238 if ($frame & 2) { 4239 if ($frame & 4) { # Extended exit message 4240 _indent_print_line_info(0, "out "); 4241 print_trace( $LINEINFO, -1, 1, 1, "$sub$al" ); 4242 } 4243 else { 4244 _indent_print_line_info(0, "exited $sub$al\n" ); 4245 } 4246 } 4247 4248 if (wantarray) { 4249 # Print the return info if we need to. 4250 if ( $doret eq $stack_depth or $frame & 16 ) { 4251 4252 # Turn off output record separator. 4253 local $\ = ''; 4254 my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO ); 4255 4256 # Indent if we're printing because of $frame tracing. 4257 if ($frame & 16) 4258 { 4259 print {$fh} ' ' x $stack_depth; 4260 } 4261 4262 # Print the return value. 4263 print {$fh} "list context return from $sub:\n"; 4264 dumpit( $fh, \@ret ); 4265 4266 # And don't print it again. 4267 $doret = -2; 4268 } ## end if ($doret eq $stack_depth... 4269 # And we have to return the return value now. 4270 @ret; 4271 } ## end if (wantarray) 4272 # Scalar context. 4273 else { 4274 # If we are supposed to show the return value... same as before. 4275 if ( $doret eq $stack_depth or $frame & 16 and defined wantarray ) { 4276 local $\ = ''; 4277 my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO ); 4278 print $fh ( ' ' x $stack_depth ) if $frame & 16; 4279 print $fh ( 4280 defined wantarray 4281 ? "scalar context return from $sub: " 4282 : "void context return from $sub\n" 4283 ); 4284 dumpit( $fh, $ret ) if defined wantarray; 4285 $doret = -2; 4286 } ## end if ($doret eq $stack_depth... 4287 4288 # Return the appropriate scalar value. 4289 $ret; 4290 } ## end else [ if (wantarray) 4291 } 4292} ## end sub _sub 4293 4294sub lsub : lvalue { 4295 4296 # We stack the stack pointer and then increment it to protect us 4297 # from a situation that might unwind a whole bunch of call frames 4298 # at once. Localizing the stack pointer means that it will automatically 4299 # unwind the same amount when multiple stack frames are unwound. 4300 local $stack_depth = $stack_depth + 1; # Protect from non-local exits 4301 4302 # Expand @stack. 4303 $#stack = $stack_depth; 4304 4305 # Save current single-step setting. 4306 $stack[-1] = $single; 4307 4308 # Turn off all flags except single-stepping. 4309 # Use local so the single-step value is popped back off the 4310 # stack for us. 4311 local $single = $single & 1; 4312 4313 no strict 'refs'; 4314 { 4315 # lock ourselves under threads 4316 lock($DBGR); 4317 4318 # Whether or not the autoloader was running, a scalar to put the 4319 # sub's return value in (if needed), and an array to put the sub's 4320 # return value in (if needed). 4321 my ( $al, $ret, @ret ) = ""; 4322 if ($sub =~ /^threads::new$/ && $ENV{PERL5DB_THREADED}) { 4323 print "creating new thread\n"; 4324 } 4325 4326 # If the last ten characters are C'::AUTOLOAD', note we've traced 4327 # into AUTOLOAD for $sub. 4328 if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) { 4329 $al = " for $$sub"; 4330 } 4331 4332 # If we've gotten really deeply recursed, turn on the flag that will 4333 # make us stop with the 'deep recursion' message. 4334 $single |= 4 if $stack_depth == $deep; 4335 4336 # If frame messages are on ... 4337 _print_frame_message($al); 4338 } 4339 4340 # call the original lvalue sub. 4341 &$sub; 4342} 4343 4344# Abstracting common code from multiple places elsewhere: 4345sub depth_print_lineinfo { 4346 my $always_print = shift; 4347 4348 print_lineinfo( @_ ) if ($always_print or $stack_depth < $trace_to_depth); 4349} 4350 4351=head1 EXTENDED COMMAND HANDLING AND THE COMMAND API 4352 4353In Perl 5.8.0, there was a major realignment of the commands and what they did, 4354Most of the changes were to systematize the command structure and to eliminate 4355commands that threw away user input without checking. 4356 4357The following sections describe the code added to make it easy to support 4358multiple command sets with conflicting command names. This section is a start 4359at unifying all command processing to make it simpler to develop commands. 4360 4361Note that all the cmd_[a-zA-Z] subroutines require the command name, a line 4362number, and C<$dbline> (the current line) as arguments. 4363 4364Support functions in this section which have multiple modes of failure C<die> 4365on error; the rest simply return a false value. 4366 4367The user-interface functions (all of the C<cmd_*> functions) just output 4368error messages. 4369 4370=head2 C<%set> 4371 4372The C<%set> hash defines the mapping from command letter to subroutine 4373name suffix. 4374 4375C<%set> is a two-level hash, indexed by set name and then by command name. 4376Note that trying to set the CommandSet to C<foobar> simply results in the 43775.8.0 command set being used, since there's no top-level entry for C<foobar>. 4378 4379=cut 4380 4381### The API section 4382 4383my %set = ( # 4384 'pre580' => { 4385 'a' => 'pre580_a', 4386 'A' => 'pre580_null', 4387 'b' => 'pre580_b', 4388 'B' => 'pre580_null', 4389 'd' => 'pre580_null', 4390 'D' => 'pre580_D', 4391 'h' => 'pre580_h', 4392 'M' => 'pre580_null', 4393 'O' => 'o', 4394 'o' => 'pre580_null', 4395 'v' => 'M', 4396 'w' => 'v', 4397 'W' => 'pre580_W', 4398 }, 4399 'pre590' => { 4400 '<' => 'pre590_prepost', 4401 '<<' => 'pre590_prepost', 4402 '>' => 'pre590_prepost', 4403 '>>' => 'pre590_prepost', 4404 '{' => 'pre590_prepost', 4405 '{{' => 'pre590_prepost', 4406 }, 4407); 4408 4409my %breakpoints_data; 4410 4411sub _has_breakpoint_data_ref { 4412 my ($filename, $line) = @_; 4413 4414 return ( 4415 exists( $breakpoints_data{$filename} ) 4416 and 4417 exists( $breakpoints_data{$filename}{$line} ) 4418 ); 4419} 4420 4421sub _get_breakpoint_data_ref { 4422 my ($filename, $line) = @_; 4423 4424 return ($breakpoints_data{$filename}{$line} ||= +{}); 4425} 4426 4427sub _delete_breakpoint_data_ref { 4428 my ($filename, $line) = @_; 4429 4430 delete($breakpoints_data{$filename}{$line}); 4431 if (! scalar(keys( %{$breakpoints_data{$filename}} )) ) { 4432 delete($breakpoints_data{$filename}); 4433 } 4434 4435 return; 4436} 4437 4438sub _set_breakpoint_enabled_status { 4439 my ($filename, $line, $status) = @_; 4440 4441 _get_breakpoint_data_ref($filename, $line)->{'enabled'} = 4442 ($status ? 1 : '') 4443 ; 4444 4445 return; 4446} 4447 4448sub _enable_breakpoint_temp_enabled_status { 4449 my ($filename, $line) = @_; 4450 4451 _get_breakpoint_data_ref($filename, $line)->{'temp_enabled'} = 1; 4452 4453 return; 4454} 4455 4456sub _cancel_breakpoint_temp_enabled_status { 4457 my ($filename, $line) = @_; 4458 4459 my $ref = _get_breakpoint_data_ref($filename, $line); 4460 4461 delete ($ref->{'temp_enabled'}); 4462 4463 if (! %$ref) { 4464 _delete_breakpoint_data_ref($filename, $line); 4465 } 4466 4467 return; 4468} 4469 4470sub _is_breakpoint_enabled { 4471 my ($filename, $line) = @_; 4472 4473 my $data_ref = _get_breakpoint_data_ref($filename, $line); 4474 return ($data_ref->{'enabled'} || $data_ref->{'temp_enabled'}); 4475} 4476 4477=head2 C<cmd_wrapper()> (API) 4478 4479C<cmd_wrapper()> allows the debugger to switch command sets 4480depending on the value of the C<CommandSet> option. 4481 4482It tries to look up the command in the C<%set> package-level I<lexical> 4483(which means external entities can't fiddle with it) and create the name of 4484the sub to call based on the value found in the hash (if it's there). I<All> 4485of the commands to be handled in a set have to be added to C<%set>; if they 4486aren't found, the 5.8.0 equivalent is called (if there is one). 4487 4488This code uses symbolic references. 4489 4490=cut 4491 4492sub cmd_wrapper { 4493 my $cmd = shift; 4494 my $line = shift; 4495 my $dblineno = shift; 4496 4497 # Assemble the command subroutine's name by looking up the 4498 # command set and command name in %set. If we can't find it, 4499 # default to the older version of the command. 4500 my $call = 'cmd_' 4501 . ( $set{$CommandSet}{$cmd} 4502 || ( $cmd =~ /\A[<>{]+/o ? 'prepost' : $cmd ) ); 4503 4504 # Call the command subroutine, call it by name. 4505 return __PACKAGE__->can($call)->( $cmd, $line, $dblineno ); 4506} ## end sub cmd_wrapper 4507 4508=head3 C<cmd_a> (command) 4509 4510The C<a> command handles pre-execution actions. These are associated with a 4511particular line, so they're stored in C<%dbline>. We default to the current 4512line if none is specified. 4513 4514=cut 4515 4516sub cmd_a { 4517 my $cmd = shift; 4518 my $line = shift || ''; # [.|line] expr 4519 my $dbline = shift; 4520 4521 # If it's dot (here), or not all digits, use the current line. 4522 $line =~ s/\A\./$dbline/; 4523 4524 # Should be a line number followed by an expression. 4525 if ( my ($lineno, $expr) = $line =~ /^\s*(\d*)\s*(\S.+)/ ) { 4526 4527 if (! length($lineno)) { 4528 $lineno = $dbline; 4529 } 4530 4531 # If we have an expression ... 4532 if ( length $expr ) { 4533 4534 # ... but the line isn't breakable, complain. 4535 if ( $dbline[$lineno] == 0 ) { 4536 print $OUT 4537 "Line $lineno($dbline[$lineno]) does not have an action?\n"; 4538 } 4539 else { 4540 4541 # It's executable. Record that the line has an action. 4542 $had_breakpoints{$filename} |= 2; 4543 4544 # Remove any action, temp breakpoint, etc. 4545 $dbline{$lineno} =~ s/\0[^\0]*//; 4546 4547 # Add the action to the line. 4548 $dbline{$lineno} .= "\0" . action($expr); 4549 4550 _set_breakpoint_enabled_status($filename, $lineno, 1); 4551 } 4552 } ## end if (length $expr) 4553 } ## end if ($line =~ /^\s*(\d*)\s*(\S.+)/) 4554 else { 4555 4556 # Syntax wrong. 4557 print $OUT 4558 "Adding an action requires an optional lineno and an expression\n" 4559 ; # hint 4560 } 4561} ## end sub cmd_a 4562 4563=head3 C<cmd_A> (command) 4564 4565Delete actions. Similar to above, except the delete code is in a separate 4566subroutine, C<delete_action>. 4567 4568=cut 4569 4570sub cmd_A { 4571 my $cmd = shift; 4572 my $line = shift || ''; 4573 my $dbline = shift; 4574 4575 # Dot is this line. 4576 $line =~ s/^\./$dbline/; 4577 4578 # Call delete_action with a null param to delete them all. 4579 # The '1' forces the eval to be true. It'll be false only 4580 # if delete_action blows up for some reason, in which case 4581 # we print $@ and get out. 4582 if ( $line eq '*' ) { 4583 if (! eval { _delete_all_actions(); 1 }) { 4584 print {$OUT} $@; 4585 return; 4586 } 4587 } 4588 4589 # There's a real line number. Pass it to delete_action. 4590 # Error trapping is as above. 4591 elsif ( $line =~ /^(\S.*)/ ) { 4592 if (! eval { delete_action($1); 1 }) { 4593 print {$OUT} $@; 4594 return; 4595 } 4596 } 4597 4598 # Swing and a miss. Bad syntax. 4599 else { 4600 print $OUT 4601 "Deleting an action requires a line number, or '*' for all\n" ; # hint 4602 } 4603} ## end sub cmd_A 4604 4605=head3 C<delete_action> (API) 4606 4607C<delete_action> accepts either a line number or C<undef>. If a line number 4608is specified, we check for the line being executable (if it's not, it 4609couldn't have had an action). If it is, we just take the action off (this 4610will get any kind of an action, including breakpoints). 4611 4612=cut 4613 4614sub _remove_action_from_dbline { 4615 my $i = shift; 4616 4617 $dbline{$i} =~ s/\0[^\0]*//; # \^a 4618 delete $dbline{$i} if $dbline{$i} eq ''; 4619 4620 return; 4621} 4622 4623sub _delete_all_actions { 4624 print {$OUT} "Deleting all actions...\n"; 4625 4626 for my $file ( keys %had_breakpoints ) { 4627 local *dbline = $main::{ '_<' . $file }; 4628 $max = $#dbline; 4629 my $was; 4630 for my $i (1 .. $max) { 4631 if ( defined $dbline{$i} ) { 4632 _remove_action_from_dbline($i); 4633 } 4634 } 4635 4636 unless ( $had_breakpoints{$file} &= ~2 ) { 4637 delete $had_breakpoints{$file}; 4638 } 4639 } 4640 4641 return; 4642} 4643 4644sub delete_action { 4645 my $i = shift; 4646 4647 if ( defined($i) ) { 4648 # Can there be one? 4649 die "Line $i has no action .\n" if $dbline[$i] == 0; 4650 4651 # Nuke whatever's there. 4652 _remove_action_from_dbline($i); 4653 } 4654 else { 4655 _delete_all_actions(); 4656 } 4657} 4658 4659=head3 C<cmd_b> (command) 4660 4661Set breakpoints. Since breakpoints can be set in so many places, in so many 4662ways, conditionally or not, the breakpoint code is kind of complex. Mostly, 4663we try to parse the command type, and then shuttle it off to an appropriate 4664subroutine to actually do the work of setting the breakpoint in the right 4665place. 4666 4667=cut 4668 4669sub cmd_b { 4670 my $cmd = shift; 4671 my $line = shift; # [.|line] [cond] 4672 my $dbline = shift; 4673 4674 my $default_cond = sub { 4675 my $cond = shift; 4676 return length($cond) ? $cond : '1'; 4677 }; 4678 4679 # Make . the current line number if it's there.. 4680 $line =~ s/^\.(\s|\z)/$dbline$1/; 4681 4682 # No line number, no condition. Simple break on current line. 4683 if ( $line =~ /^\s*$/ ) { 4684 cmd_b_line( $dbline, 1 ); 4685 } 4686 4687 # Break on load for a file. 4688 elsif ( my ($file) = $line =~ /^load\b\s*(.*)/ ) { 4689 $file =~ s/\s+\z//; 4690 cmd_b_load($file); 4691 } 4692 4693 # b compile|postpone <some sub> [<condition>] 4694 # The interpreter actually traps this one for us; we just put the 4695 # necessary condition in the %postponed hash. 4696 elsif ( my ($action, $subname, $cond) 4697 = $line =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) { 4698 4699 # De-Perl4-ify the name - ' separators to ::. 4700 $subname =~ s/'/::/g; 4701 4702 # Qualify it into the current package unless it's already qualified. 4703 $subname = "${package}::" . $subname unless $subname =~ /::/; 4704 4705 # Add main if it starts with ::. 4706 $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::"; 4707 4708 # Save the break type for this sub. 4709 $postponed{$subname} = (($action eq 'postpone') 4710 ? ( "break +0 if " . $default_cond->($cond) ) 4711 : "compile"); 4712 } ## end elsif ($line =~ ... 4713 # b <filename>:<line> [<condition>] 4714 elsif (my ($filename, $line_num, $cond) 4715 = $line =~ /\A(\S+[^:]):(\d+)\s*(.*)/ms) { 4716 cmd_b_filename_line( 4717 $filename, 4718 $line_num, 4719 (length($cond) ? $cond : '1'), 4720 ); 4721 } 4722 # b <sub name> [<condition>] 4723 elsif ( my ($new_subname, $new_cond) = 4724 $line =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) { 4725 4726 # 4727 $subname = $new_subname; 4728 cmd_b_sub( $subname, $default_cond->($new_cond) ); 4729 } 4730 4731 # b <line> [<condition>]. 4732 elsif ( my ($line_n, $cond) = $line =~ /^(\d*)\s*(.*)/ ) { 4733 4734 # Capture the line. If none, it's the current line. 4735 $line = $line_n || $dbline; 4736 4737 # Break on line. 4738 cmd_b_line( $line, $default_cond->($cond) ); 4739 } 4740 4741 # Line didn't make sense. 4742 else { 4743 print "confused by line($line)?\n"; 4744 } 4745 4746 return; 4747} ## end sub cmd_b 4748 4749=head3 C<break_on_load> (API) 4750 4751We want to break when this file is loaded. Mark this file in the 4752C<%break_on_load> hash, and note that it has a breakpoint in 4753C<%had_breakpoints>. 4754 4755=cut 4756 4757sub break_on_load { 4758 my $file = shift; 4759 $break_on_load{$file} = 1; 4760 $had_breakpoints{$file} |= 1; 4761} 4762 4763=head3 C<report_break_on_load> (API) 4764 4765Gives us an array of filenames that are set to break on load. Note that 4766only files with break-on-load are in here, so simply showing the keys 4767suffices. 4768 4769=cut 4770 4771sub report_break_on_load { 4772 sort keys %break_on_load; 4773} 4774 4775=head3 C<cmd_b_load> (command) 4776 4777We take the file passed in and try to find it in C<%INC> (which maps modules 4778to files they came from). We mark those files for break-on-load via 4779C<break_on_load> and then report that it was done. 4780 4781=cut 4782 4783sub cmd_b_load { 4784 my $file = shift; 4785 my @files; 4786 4787 # This is a block because that way we can use a redo inside it 4788 # even without there being any looping structure at all outside it. 4789 { 4790 4791 # Save short name and full path if found. 4792 push @files, $file; 4793 push @files, $::INC{$file} if $::INC{$file}; 4794 4795 # Tack on .pm and do it again unless there was a '.' in the name 4796 # already. 4797 $file .= '.pm', redo unless $file =~ /\./; 4798 } 4799 4800 # Do the real work here. 4801 break_on_load($_) for @files; 4802 4803 # All the files that have break-on-load breakpoints. 4804 @files = report_break_on_load; 4805 4806 # Normalize for the purposes of our printing this. 4807 local $\ = ''; 4808 local $" = ' '; 4809 print $OUT "Will stop on load of '@files'.\n"; 4810} ## end sub cmd_b_load 4811 4812=head3 C<$filename_error> (API package global) 4813 4814Several of the functions we need to implement in the API need to work both 4815on the current file and on other files. We don't want to duplicate code, so 4816C<$filename_error> is used to contain the name of the file that's being 4817worked on (if it's not the current one). 4818 4819We can now build functions in pairs: the basic function works on the current 4820file, and uses C<$filename_error> as part of its error message. Since this is 4821initialized to C<"">, no filename will appear when we are working on the 4822current file. 4823 4824The second function is a wrapper which does the following: 4825 4826=over 4 4827 4828=item * 4829 4830Localizes C<$filename_error> and sets it to the name of the file to be processed. 4831 4832=item * 4833 4834Localizes the C<*dbline> glob and reassigns it to point to the file we want to process. 4835 4836=item * 4837 4838Calls the first function. 4839 4840The first function works on the I<current> file (i.e., the one we changed to), 4841and prints C<$filename_error> in the error message (the name of the other file) 4842if it needs to. When the functions return, C<*dbline> is restored to point 4843to the actual current file (the one we're executing in) and 4844C<$filename_error> is restored to C<"">. This restores everything to 4845the way it was before the second function was called at all. 4846 4847See the comments in C<breakable_line> and C<breakable_line_in_file> for more 4848details. 4849 4850=back 4851 4852=cut 4853 4854use vars qw($filename_error); 4855$filename_error = ''; 4856 4857=head3 breakable_line(from, to) (API) 4858 4859The subroutine decides whether or not a line in the current file is breakable. 4860It walks through C<@dbline> within the range of lines specified, looking for 4861the first line that is breakable. 4862 4863If C<$to> is greater than C<$from>, the search moves forwards, finding the 4864first line I<after> C<$to> that's breakable, if there is one. 4865 4866If C<$from> is greater than C<$to>, the search goes I<backwards>, finding the 4867first line I<before> C<$to> that's breakable, if there is one. 4868 4869=cut 4870 4871sub breakable_line { 4872 4873 my ( $from, $to ) = @_; 4874 4875 # $i is the start point. (Where are the FORTRAN programs of yesteryear?) 4876 my $i = $from; 4877 4878 # If there are at least 2 arguments, we're trying to search a range. 4879 if ( @_ >= 2 ) { 4880 4881 # $delta is positive for a forward search, negative for a backward one. 4882 my $delta = $from < $to ? +1 : -1; 4883 4884 # Keep us from running off the ends of the file. 4885 my $limit = $delta > 0 ? $#dbline : 1; 4886 4887 # Clever test. If you're a mathematician, it's obvious why this 4888 # test works. If not: 4889 # If $delta is positive (going forward), $limit will be $#dbline. 4890 # If $to is less than $limit, ($limit - $to) will be positive, times 4891 # $delta of 1 (positive), so the result is > 0 and we should use $to 4892 # as the stopping point. 4893 # 4894 # If $to is greater than $limit, ($limit - $to) is negative, 4895 # times $delta of 1 (positive), so the result is < 0 and we should 4896 # use $limit ($#dbline) as the stopping point. 4897 # 4898 # If $delta is negative (going backward), $limit will be 1. 4899 # If $to is zero, ($limit - $to) will be 1, times $delta of -1 4900 # (negative) so the result is > 0, and we use $to as the stopping 4901 # point. 4902 # 4903 # If $to is less than zero, ($limit - $to) will be positive, 4904 # times $delta of -1 (negative), so the result is not > 0, and 4905 # we use $limit (1) as the stopping point. 4906 # 4907 # If $to is 1, ($limit - $to) will zero, times $delta of -1 4908 # (negative), still giving zero; the result is not > 0, and 4909 # we use $limit (1) as the stopping point. 4910 # 4911 # if $to is >1, ($limit - $to) will be negative, times $delta of -1 4912 # (negative), giving a positive (>0) value, so we'll set $limit to 4913 # $to. 4914 4915 $limit = $to if ( $limit - $to ) * $delta > 0; 4916 4917 # The real search loop. 4918 # $i starts at $from (the point we want to start searching from). 4919 # We move through @dbline in the appropriate direction (determined 4920 # by $delta: either -1 (back) or +1 (ahead). 4921 # We stay in as long as we haven't hit an executable line 4922 # ($dbline[$i] == 0 means not executable) and we haven't reached 4923 # the limit yet (test similar to the above). 4924 $i += $delta while $dbline[$i] == 0 and ( $limit - $i ) * $delta > 0; 4925 4926 } ## end if (@_ >= 2) 4927 4928 # If $i points to a line that is executable, return that. 4929 return $i unless $dbline[$i] == 0; 4930 4931 # Format the message and print it: no breakable lines in range. 4932 my ( $pl, $upto ) = ( '', '' ); 4933 ( $pl, $upto ) = ( 's', "..$to" ) if @_ >= 2 and $from != $to; 4934 4935 # If there's a filename in filename_error, we'll see it. 4936 # If not, not. 4937 die "Line$pl $from$upto$filename_error not breakable\n"; 4938} ## end sub breakable_line 4939 4940=head3 breakable_line_in_filename(file, from, to) (API) 4941 4942Like C<breakable_line>, but look in another file. 4943 4944=cut 4945 4946sub breakable_line_in_filename { 4947 4948 # Capture the file name. 4949 my ($f) = shift; 4950 4951 # Swap the magic line array over there temporarily. 4952 local *dbline = $main::{ '_<' . $f }; 4953 4954 # If there's an error, it's in this other file. 4955 local $filename_error = " of '$f'"; 4956 4957 # Find the breakable line. 4958 breakable_line(@_); 4959 4960 # *dbline and $filename_error get restored when this block ends. 4961 4962} ## end sub breakable_line_in_filename 4963 4964=head3 break_on_line(lineno, [condition]) (API) 4965 4966Adds a breakpoint with the specified condition (or 1 if no condition was 4967specified) to the specified line. Dies if it can't. 4968 4969=cut 4970 4971sub break_on_line { 4972 my $i = shift; 4973 my $cond = @_ ? shift(@_) : 1; 4974 4975 my $inii = $i; 4976 my $after = ''; 4977 my $pl = ''; 4978 4979 # Woops, not a breakable line. $filename_error allows us to say 4980 # if it was in a different file. 4981 die "Line $i$filename_error not breakable.\n" if $dbline[$i] == 0; 4982 4983 # Mark this file as having breakpoints in it. 4984 $had_breakpoints{$filename} |= 1; 4985 4986 # If there is an action or condition here already ... 4987 if ( $dbline{$i} ) { 4988 4989 # ... swap this condition for the existing one. 4990 $dbline{$i} =~ s/^[^\0]*/$cond/; 4991 } 4992 else { 4993 4994 # Nothing here - just add the condition. 4995 $dbline{$i} = $cond; 4996 4997 _set_breakpoint_enabled_status($filename, $i, 1); 4998 } 4999 5000 return; 5001} ## end sub break_on_line 5002 5003=head3 cmd_b_line(line, [condition]) (command) 5004 5005Wrapper for C<break_on_line>. Prints the failure message if it 5006doesn't work. 5007 5008=cut 5009 5010sub cmd_b_line { 5011 if (not eval { break_on_line(@_); 1 }) { 5012 local $\ = ''; 5013 print $OUT $@ and return; 5014 } 5015 5016 return; 5017} ## end sub cmd_b_line 5018 5019=head3 cmd_b_filename_line(line, [condition]) (command) 5020 5021Wrapper for C<break_on_filename_line>. Prints the failure message if it 5022doesn't work. 5023 5024=cut 5025 5026sub cmd_b_filename_line { 5027 if (not eval { break_on_filename_line(@_); 1 }) { 5028 local $\ = ''; 5029 print $OUT $@ and return; 5030 } 5031 5032 return; 5033} 5034 5035=head3 break_on_filename_line(file, line, [condition]) (API) 5036 5037Switches to the file specified and then calls C<break_on_line> to set 5038the breakpoint. 5039 5040=cut 5041 5042sub break_on_filename_line { 5043 my $f = shift; 5044 my $i = shift; 5045 my $cond = @_ ? shift(@_) : 1; 5046 5047 # Switch the magical hash temporarily. 5048 local *dbline = $main::{ '_<' . $f }; 5049 5050 # Localize the variables that break_on_line uses to make its message. 5051 local $filename_error = " of '$f'"; 5052 local $filename = $f; 5053 5054 # Add the breakpoint. 5055 break_on_line( $i, $cond ); 5056 5057 return; 5058} ## end sub break_on_filename_line 5059 5060=head3 break_on_filename_line_range(file, from, to, [condition]) (API) 5061 5062Switch to another file, search the range of lines specified for an 5063executable one, and put a breakpoint on the first one you find. 5064 5065=cut 5066 5067sub break_on_filename_line_range { 5068 my $f = shift; 5069 my $from = shift; 5070 my $to = shift; 5071 my $cond = @_ ? shift(@_) : 1; 5072 5073 # Find a breakable line if there is one. 5074 my $i = breakable_line_in_filename( $f, $from, $to ); 5075 5076 # Add the breakpoint. 5077 break_on_filename_line( $f, $i, $cond ); 5078 5079 return; 5080} ## end sub break_on_filename_line_range 5081 5082=head3 subroutine_filename_lines(subname, [condition]) (API) 5083 5084Search for a subroutine within a given file. The condition is ignored. 5085Uses C<find_sub> to locate the desired subroutine. 5086 5087=cut 5088 5089sub subroutine_filename_lines { 5090 my ( $subname ) = @_; 5091 5092 # Returned value from find_sub() is fullpathname:startline-endline. 5093 # The match creates the list (fullpathname, start, end). 5094 return (find_sub($subname) =~ /^(.*):(\d+)-(\d+)$/); 5095} ## end sub subroutine_filename_lines 5096 5097=head3 break_subroutine(subname) (API) 5098 5099Places a break on the first line possible in the specified subroutine. Uses 5100C<subroutine_filename_lines> to find the subroutine, and 5101C<break_on_filename_line_range> to place the break. 5102 5103=cut 5104 5105sub break_subroutine { 5106 my $subname = shift; 5107 5108 # Get filename, start, and end. 5109 my ( $file, $s, $e ) = subroutine_filename_lines($subname) 5110 or die "Subroutine $subname not found.\n"; 5111 5112 5113 # Null condition changes to '1' (always true). 5114 my $cond = @_ ? shift(@_) : 1; 5115 5116 # Put a break the first place possible in the range of lines 5117 # that make up this subroutine. 5118 break_on_filename_line_range( $file, $s, $e, $cond ); 5119 5120 return; 5121} ## end sub break_subroutine 5122 5123=head3 cmd_b_sub(subname, [condition]) (command) 5124 5125We take the incoming subroutine name and fully-qualify it as best we can. 5126 5127=over 4 5128 5129=item 1. If it's already fully-qualified, leave it alone. 5130 5131=item 2. Try putting it in the current package. 5132 5133=item 3. If it's not there, try putting it in CORE::GLOBAL if it exists there. 5134 5135=item 4. If it starts with '::', put it in 'main::'. 5136 5137=back 5138 5139After all this cleanup, we call C<break_subroutine> to try to set the 5140breakpoint. 5141 5142=cut 5143 5144sub cmd_b_sub { 5145 my $subname = shift; 5146 my $cond = @_ ? shift : 1; 5147 5148 # If the subname isn't a code reference, qualify it so that 5149 # break_subroutine() will work right. 5150 if ( ref($subname) ne 'CODE' ) { 5151 5152 # Not Perl 4. 5153 $subname =~ s/'/::/g; 5154 my $s = $subname; 5155 5156 # Put it in this package unless it's already qualified. 5157 if ($subname !~ /::/) 5158 { 5159 $subname = $package . '::' . $subname; 5160 }; 5161 5162 # Requalify it into CORE::GLOBAL if qualifying it into this 5163 # package resulted in its not being defined, but only do so 5164 # if it really is in CORE::GLOBAL. 5165 my $core_name = "CORE::GLOBAL::$s"; 5166 if ((!defined(&$subname)) 5167 and ($s !~ /::/) 5168 and (defined &{$core_name})) 5169 { 5170 $subname = $core_name; 5171 } 5172 5173 # Put it in package 'main' if it has a leading ::. 5174 if ($subname =~ /\A::/) 5175 { 5176 $subname = "main" . $subname; 5177 } 5178 } ## end if ( ref($subname) ne 'CODE' ) { 5179 5180 # Try to set the breakpoint. 5181 if (not eval { break_subroutine( $subname, $cond ); 1 }) { 5182 local $\ = ''; 5183 print {$OUT} $@; 5184 return; 5185 } 5186 5187 return; 5188} ## end sub cmd_b_sub 5189 5190=head3 C<cmd_B> - delete breakpoint(s) (command) 5191 5192The command mostly parses the command line and tries to turn the argument 5193into a line spec. If it can't, it uses the current line. It then calls 5194C<delete_breakpoint> to actually do the work. 5195 5196If C<*> is specified, C<cmd_B> calls C<delete_breakpoint> with no arguments, 5197thereby deleting all the breakpoints. 5198 5199=cut 5200 5201sub cmd_B { 5202 my $cmd = shift; 5203 5204 # No line spec? Use dbline. 5205 # If there is one, use it if it's non-zero, or wipe it out if it is. 5206 my $line = ( $_[0] =~ /\A\./ ) ? $dbline : (shift || ''); 5207 my $dbline = shift; 5208 5209 # If the line was dot, make the line the current one. 5210 $line =~ s/^\./$dbline/; 5211 5212 # If it's * we're deleting all the breakpoints. 5213 if ( $line eq '*' ) { 5214 if (not eval { delete_breakpoint(); 1 }) { 5215 print {$OUT} $@; 5216 } 5217 } 5218 5219 # If there is a line spec, delete the breakpoint on that line. 5220 elsif ( $line =~ /\A(\S.*)/ ) { 5221 if (not eval { delete_breakpoint( $line || $dbline ); 1 }) { 5222 local $\ = ''; 5223 print {$OUT} $@; 5224 } 5225 } ## end elsif ($line =~ /^(\S.*)/) 5226 5227 # No line spec. 5228 else { 5229 print {$OUT} 5230 "Deleting a breakpoint requires a line number, or '*' for all\n" 5231 ; # hint 5232 } 5233 5234 return; 5235} ## end sub cmd_B 5236 5237=head3 delete_breakpoint([line]) (API) 5238 5239This actually does the work of deleting either a single breakpoint, or all 5240of them. 5241 5242For a single line, we look for it in C<@dbline>. If it's nonbreakable, we 5243just drop out with a message saying so. If it is, we remove the condition 5244part of the 'condition\0action' that says there's a breakpoint here. If, 5245after we've done that, there's nothing left, we delete the corresponding 5246line in C<%dbline> to signal that no action needs to be taken for this line. 5247 5248For all breakpoints, we iterate through the keys of C<%had_breakpoints>, 5249which lists all currently-loaded files which have breakpoints. We then look 5250at each line in each of these files, temporarily switching the C<%dbline> 5251and C<@dbline> structures to point to the files in question, and do what 5252we did in the single line case: delete the condition in C<@dbline>, and 5253delete the key in C<%dbline> if nothing's left. 5254 5255We then wholesale delete C<%postponed>, C<%postponed_file>, and 5256C<%break_on_load>, because these structures contain breakpoints for files 5257and code that haven't been loaded yet. We can just kill these off because there 5258are no magical debugger structures associated with them. 5259 5260=cut 5261 5262sub _remove_breakpoint_entry { 5263 my ($fn, $i) = @_; 5264 5265 delete $dbline{$i}; 5266 _delete_breakpoint_data_ref($fn, $i); 5267 5268 return; 5269} 5270 5271sub _delete_all_breakpoints { 5272 print {$OUT} "Deleting all breakpoints...\n"; 5273 5274 # %had_breakpoints lists every file that had at least one 5275 # breakpoint in it. 5276 for my $fn ( keys %had_breakpoints ) { 5277 5278 # Switch to the desired file temporarily. 5279 local *dbline = $main::{ '_<' . $fn }; 5280 5281 $max = $#dbline; 5282 5283 # For all lines in this file ... 5284 for my $i (1 .. $max) { 5285 5286 # If there's a breakpoint or action on this line ... 5287 if ( defined $dbline{$i} ) { 5288 5289 # ... remove the breakpoint. 5290 $dbline{$i} =~ s/\A[^\0]+//; 5291 if ( $dbline{$i} =~ s/\A\0?\z// ) { 5292 # Remove the entry altogether if no action is there. 5293 _remove_breakpoint_entry($fn, $i); 5294 } 5295 } ## end if (defined $dbline{$i... 5296 } ## end for $i (1 .. $max) 5297 5298 # If, after we turn off the "there were breakpoints in this file" 5299 # bit, the entry in %had_breakpoints for this file is zero, 5300 # we should remove this file from the hash. 5301 if ( not $had_breakpoints{$fn} &= (~1) ) { 5302 delete $had_breakpoints{$fn}; 5303 } 5304 } ## end for my $fn (keys %had_breakpoints) 5305 5306 # Kill off all the other breakpoints that are waiting for files that 5307 # haven't been loaded yet. 5308 undef %postponed; 5309 undef %postponed_file; 5310 undef %break_on_load; 5311 5312 return; 5313} 5314 5315sub _delete_breakpoint_from_line { 5316 my ($i) = @_; 5317 5318 # Woops. This line wasn't breakable at all. 5319 die "Line $i not breakable.\n" if $dbline[$i] == 0; 5320 5321 # Kill the condition, but leave any action. 5322 $dbline{$i} =~ s/\A[^\0]*//; 5323 5324 # Remove the entry entirely if there's no action left. 5325 if ($dbline{$i} eq '') { 5326 _remove_breakpoint_entry($filename, $i); 5327 } 5328 5329 return; 5330} 5331 5332sub delete_breakpoint { 5333 my $i = shift; 5334 5335 # If we got a line, delete just that one. 5336 if ( defined($i) ) { 5337 _delete_breakpoint_from_line($i); 5338 } 5339 # No line; delete them all. 5340 else { 5341 _delete_all_breakpoints(); 5342 } 5343 5344 return; 5345} 5346 5347=head3 cmd_stop (command) 5348 5349This is meant to be part of the new command API, but it isn't called or used 5350anywhere else in the debugger. XXX It is probably meant for use in development 5351of new commands. 5352 5353=cut 5354 5355sub cmd_stop { # As on ^C, but not signal-safy. 5356 $signal = 1; 5357} 5358 5359=head3 C<cmd_e> - threads 5360 5361Display the current thread id: 5362 5363 e 5364 5365This could be how (when implemented) to send commands to this thread id (e cmd) 5366or that thread id (e tid cmd). 5367 5368=cut 5369 5370sub cmd_e { 5371 my $cmd = shift; 5372 my $line = shift; 5373 unless (exists($INC{'threads.pm'})) { 5374 print "threads not loaded($ENV{PERL5DB_THREADED}) 5375 please run the debugger with PERL5DB_THREADED=1 set in the environment\n"; 5376 } else { 5377 my $tid = threads->tid; 5378 print "thread id: $tid\n"; 5379 } 5380} ## end sub cmd_e 5381 5382=head3 C<cmd_E> - list of thread ids 5383 5384Display the list of available thread ids: 5385 5386 E 5387 5388This could be used (when implemented) to send commands to all threads (E cmd). 5389 5390=cut 5391 5392sub cmd_E { 5393 my $cmd = shift; 5394 my $line = shift; 5395 unless (exists($INC{'threads.pm'})) { 5396 print "threads not loaded($ENV{PERL5DB_THREADED}) 5397 please run the debugger with PERL5DB_THREADED=1 set in the environment\n"; 5398 } else { 5399 my $tid = threads->tid; 5400 print "thread ids: ".join(', ', 5401 map { ($tid == $_->tid ? '<'.$_->tid.'>' : $_->tid) } threads->list 5402 )."\n"; 5403 } 5404} ## end sub cmd_E 5405 5406=head3 C<cmd_h> - help command (command) 5407 5408Does the work of either 5409 5410=over 4 5411 5412=item * 5413 5414Showing all the debugger help 5415 5416=item * 5417 5418Showing help for a specific command 5419 5420=back 5421 5422=cut 5423 5424use vars qw($help); 5425use vars qw($summary); 5426 5427sub cmd_h { 5428 my $cmd = shift; 5429 5430 # If we have no operand, assume null. 5431 my $line = shift || ''; 5432 5433 # 'h h'. Print the long-format help. 5434 if ( $line =~ /\Ah\s*\z/ ) { 5435 print_help($help); 5436 } 5437 5438 # 'h <something>'. Search for the command and print only its help. 5439 elsif ( my ($asked) = $line =~ /\A(\S.*)\z/ ) { 5440 5441 # support long commands; otherwise bogus errors 5442 # happen when you ask for h on <CR> for example 5443 my $qasked = quotemeta($asked); # for searching; we don't 5444 # want to use it as a pattern. 5445 # XXX: finds CR but not <CR> 5446 5447 # Search the help string for the command. 5448 if ( 5449 $help =~ /^ # Start of a line 5450 <? # Optional '<' 5451 (?:[IB]<) # Optional markup 5452 $qasked # The requested command 5453 /mx 5454 ) 5455 { 5456 5457 # It's there; pull it out and print it. 5458 while ( 5459 $help =~ /^ 5460 (<? # Optional '<' 5461 (?:[IB]<) # Optional markup 5462 $qasked # The command 5463 ([\s\S]*?) # Description line(s) 5464 \n) # End of last description line 5465 (?!\s) # Next line not starting with 5466 # whitespace 5467 /mgx 5468 ) 5469 { 5470 print_help($1); 5471 } 5472 } 5473 5474 # Not found; not a debugger command. 5475 else { 5476 print_help("B<$asked> is not a debugger command.\n"); 5477 } 5478 } ## end elsif ($line =~ /^(\S.*)$/) 5479 5480 # 'h' - print the summary help. 5481 else { 5482 print_help($summary); 5483 } 5484} ## end sub cmd_h 5485 5486=head3 C<cmd_i> - inheritance display 5487 5488Display the (nested) parentage of the module or object given. 5489 5490=cut 5491 5492sub cmd_i { 5493 my $cmd = shift; 5494 my $line = shift; 5495 5496 require mro; 5497 5498 foreach my $isa ( split( /\s+/, $line ) ) { 5499 $evalarg = $isa; 5500 # The &-call is here to ascertain the mutability of @_. 5501 ($isa) = &DB::eval; 5502 no strict 'refs'; 5503 print join( 5504 ', ', 5505 map { 5506 "$_" 5507 . ( 5508 defined( ${"$_\::VERSION"} ) 5509 ? ' ' . ${"$_\::VERSION"} 5510 : undef ) 5511 } @{mro::get_linear_isa(ref($isa) || $isa)} 5512 ); 5513 print "\n"; 5514 } 5515} ## end sub cmd_i 5516 5517=head3 C<cmd_l> - list lines (command) 5518 5519Most of the command is taken up with transforming all the different line 5520specification syntaxes into 'start-stop'. After that is done, the command 5521runs a loop over C<@dbline> for the specified range of lines. It handles 5522the printing of each line and any markers (C<==E<gt>> for current line, 5523C<b> for break on this line, C<a> for action on this line, C<:> for this 5524line breakable). 5525 5526We save the last line listed in the C<$start> global for further listing 5527later. 5528 5529=cut 5530 5531sub _min { 5532 my $min = shift; 5533 foreach my $v (@_) { 5534 if ($min > $v) { 5535 $min = $v; 5536 } 5537 } 5538 return $min; 5539} 5540 5541sub _max { 5542 my $max = shift; 5543 foreach my $v (@_) { 5544 if ($max < $v) { 5545 $max = $v; 5546 } 5547 } 5548 return $max; 5549} 5550 5551sub _minify_to_max { 5552 my $ref = shift; 5553 5554 $$ref = _min($$ref, $max); 5555 5556 return; 5557} 5558 5559sub _cmd_l_handle_var_name { 5560 my $var_name = shift; 5561 5562 $evalarg = $var_name; 5563 5564 my ($s) = DB::eval(); 5565 5566 # Ooops. Bad scalar. 5567 if ($@) { 5568 print {$OUT} "Error: $@\n"; 5569 next CMD; 5570 } 5571 5572 # Good scalar. If it's a reference, find what it points to. 5573 $s = CvGV_name($s); 5574 print {$OUT} "Interpreted as: $1 $s\n"; 5575 $line = "$1 $s"; 5576 5577 # Call self recursively to really do the command. 5578 return _cmd_l_main( $s ); 5579} 5580 5581sub _cmd_l_handle_subname { 5582 5583 my $s = $subname; 5584 5585 # De-Perl4. 5586 $subname =~ s/\'/::/; 5587 5588 # Put it in this package unless it starts with ::. 5589 $subname = $package . "::" . $subname unless $subname =~ /::/; 5590 5591 # Put it in CORE::GLOBAL if t doesn't start with :: and 5592 # it doesn't live in this package and it lives in CORE::GLOBAL. 5593 $subname = "CORE::GLOBAL::$s" 5594 if not defined &$subname 5595 and $s !~ /::/ 5596 and defined &{"CORE::GLOBAL::$s"}; 5597 5598 # Put leading '::' names into 'main::'. 5599 $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::"; 5600 5601 # Get name:start-stop from find_sub, and break this up at 5602 # colons. 5603 my @pieces = split( /:/, find_sub($subname) || $sub{$subname} ); 5604 5605 # Pull off start-stop. 5606 my $subrange = pop @pieces; 5607 5608 # If the name contained colons, the split broke it up. 5609 # Put it back together. 5610 $file = join( ':', @pieces ); 5611 5612 # If we're not in that file, switch over to it. 5613 if ( $file ne $filename ) { 5614 if (! $slave_editor) { 5615 print {$OUT} "Switching to file '$file'.\n"; 5616 } 5617 5618 # Switch debugger's magic structures. 5619 *dbline = $main::{ '_<' . $file }; 5620 $max = $#dbline; 5621 $filename = $file; 5622 } ## end if ($file ne $filename) 5623 5624 # Subrange is 'start-stop'. If this is less than a window full, 5625 # swap it to 'start+', which will list a window from the start point. 5626 if ($subrange) { 5627 if ( eval($subrange) < -$window ) { 5628 $subrange =~ s/-.*/+/; 5629 } 5630 5631 # Call self recursively to list the range. 5632 return _cmd_l_main( $subrange ); 5633 } ## end if ($subrange) 5634 5635 # Couldn't find it. 5636 else { 5637 print {$OUT} "Subroutine $subname not found.\n"; 5638 return; 5639 } 5640} 5641 5642sub _cmd_l_empty { 5643 # Compute new range to list. 5644 $incr = $window - 1; 5645 5646 # Recurse to do it. 5647 return _cmd_l_main( $start . '-' . ( $start + $incr ) ); 5648} 5649 5650sub _cmd_l_plus { 5651 my ($new_start, $new_incr) = @_; 5652 5653 # Don't reset start for 'l +nnn'. 5654 $start = $new_start if $new_start; 5655 5656 # Increment for list. Use window size if not specified. 5657 # (Allows 'l +' to work.) 5658 $incr = $new_incr || ($window - 1); 5659 5660 # Create a line range we'll understand, and recurse to do it. 5661 return _cmd_l_main( $start . '-' . ( $start + $incr ) ); 5662} 5663 5664sub _cmd_l_calc_initial_end_and_i { 5665 my ($spec, $start_match, $end_match) = @_; 5666 5667 # Determine end point; use end of file if not specified. 5668 my $end = ( !defined $start_match ) ? $max : 5669 ( $end_match ? $end_match : $start_match ); 5670 5671 # Go on to the end, and then stop. 5672 _minify_to_max(\$end); 5673 5674 # Determine start line. 5675 my $i = $start_match; 5676 5677 if ($i eq '.') { 5678 $i = $spec; 5679 } 5680 5681 $i = _max($i, 1); 5682 5683 $incr = $end - $i; 5684 5685 return ($end, $i); 5686} 5687 5688sub _cmd_l_range { 5689 my ($spec, $current_line, $start_match, $end_match) = @_; 5690 5691 my ($end, $i) = 5692 _cmd_l_calc_initial_end_and_i($spec, $start_match, $end_match); 5693 5694 # If we're running under a slave editor, force it to show the lines. 5695 if ($slave_editor) { 5696 print {$OUT} "\032\032$filename:$i:0\n"; 5697 $i = $end; 5698 } 5699 # We're doing it ourselves. We want to show the line and special 5700 # markers for: 5701 # - the current line in execution 5702 # - whether a line is breakable or not 5703 # - whether a line has a break or not 5704 # - whether a line has an action or not 5705 else { 5706 I_TO_END: 5707 for ( ; $i <= $end ; $i++ ) { 5708 5709 # Check for breakpoints and actions. 5710 my ( $stop, $action ); 5711 if ($dbline{$i}) { 5712 ( $stop, $action ) = split( /\0/, $dbline{$i} ); 5713 } 5714 5715 # ==> if this is the current line in execution, 5716 # : if it's breakable. 5717 my $arrow = 5718 ( $i == $current_line and $filename eq $filename_ini ) 5719 ? '==>' 5720 : ( $dbline[$i] + 0 ? ':' : ' ' ); 5721 5722 # Add break and action indicators. 5723 $arrow .= 'b' if $stop; 5724 $arrow .= 'a' if $action; 5725 5726 # Print the line. 5727 print {$OUT} "$i$arrow\t", $dbline[$i]; 5728 5729 # Move on to the next line. Drop out on an interrupt. 5730 if ($signal) { 5731 $i++; 5732 last I_TO_END; 5733 } 5734 } ## end for (; $i <= $end ; $i++) 5735 5736 # Line the prompt up; print a newline if the last line listed 5737 # didn't have a newline. 5738 if ($dbline[ $i - 1 ] !~ /\n\z/) { 5739 print {$OUT} "\n"; 5740 } 5741 } ## end else [ if ($slave_editor) 5742 5743 # Save the point we last listed to in case another relative 'l' 5744 # command is desired. Don't let it run off the end. 5745 $start = $i; 5746 _minify_to_max(\$start); 5747 5748 return; 5749} 5750 5751sub _cmd_l_main { 5752 my $spec = shift; 5753 5754 # If this is '-something', delete any spaces after the dash. 5755 $spec =~ s/\A-\s*\z/-/; 5756 5757 # If the line is '$something', assume this is a scalar containing a 5758 # line number. 5759 # Set up for DB::eval() - evaluate in *user* context. 5760 if ( my ($var_name) = $spec =~ /\A(\$.*)/s ) { 5761 return _cmd_l_handle_var_name($var_name); 5762 } 5763 # l name. Try to find a sub by that name. 5764 elsif ( ($subname) = $spec =~ /\A([\':A-Za-z_][\':\w]*(?:\[.*\])?)/s ) { 5765 return _cmd_l_handle_subname(); 5766 } 5767 # Bare 'l' command. 5768 elsif ( $spec !~ /\S/ ) { 5769 return _cmd_l_empty(); 5770 } 5771 # l [start]+number_of_lines 5772 elsif ( my ($new_start, $new_incr) = $spec =~ /\A(\d*)\+(\d*)\z/ ) { 5773 return _cmd_l_plus($new_start, $new_incr); 5774 } 5775 # l start-stop or l start,stop 5776 elsif (my ($s, $e) = $spec =~ /^(?:(-?[\d\$\.]+)(?:[-,]([\d\$\.]+))?)?/ ) { 5777 return _cmd_l_range($spec, $line, $s, $e); 5778 } 5779 5780 return; 5781} ## end sub cmd_l 5782 5783sub cmd_l { 5784 my (undef, $line) = @_; 5785 5786 return _cmd_l_main($line); 5787} 5788 5789=head3 C<cmd_L> - list breakpoints, actions, and watch expressions (command) 5790 5791To list breakpoints, the command has to look determine where all of them are 5792first. It starts a C<%had_breakpoints>, which tells us what all files have 5793breakpoints and/or actions. For each file, we switch the C<*dbline> glob (the 5794magic source and breakpoint data structures) to the file, and then look 5795through C<%dbline> for lines with breakpoints and/or actions, listing them 5796out. We look through C<%postponed> not-yet-compiled subroutines that have 5797breakpoints, and through C<%postponed_file> for not-yet-C<require>'d files 5798that have breakpoints. 5799 5800Watchpoints are simpler: we just list the entries in C<@to_watch>. 5801 5802=cut 5803 5804sub _cmd_L_calc_arg { 5805 # If no argument, list everything. Pre-5.8.0 version always lists 5806 # everything 5807 my $arg = shift || 'abw'; 5808 if ($CommandSet ne '580') 5809 { 5810 $arg = 'abw'; 5811 } 5812 5813 return $arg; 5814} 5815 5816sub _cmd_L_calc_wanted_flags { 5817 my $arg = _cmd_L_calc_arg(shift); 5818 5819 return (map { index($arg, $_) >= 0 ? 1 : 0 } qw(a b w)); 5820} 5821 5822 5823sub _cmd_L_handle_breakpoints { 5824 my ($handle_db_line) = @_; 5825 5826 BREAKPOINTS_SCAN: 5827 # Look in all the files with breakpoints... 5828 for my $file ( keys %had_breakpoints ) { 5829 5830 # Temporary switch to this file. 5831 local *dbline = $main::{ '_<' . $file }; 5832 5833 # Set up to look through the whole file. 5834 $max = $#dbline; 5835 my $was; # Flag: did we print something 5836 # in this file? 5837 5838 # For each line in the file ... 5839 for my $i (1 .. $max) { 5840 5841 # We've got something on this line. 5842 if ( defined $dbline{$i} ) { 5843 5844 # Print the header if we haven't. 5845 if (not $was++) { 5846 print {$OUT} "$file:\n"; 5847 } 5848 5849 # Print the line. 5850 print {$OUT} " $i:\t", $dbline[$i]; 5851 5852 $handle_db_line->($dbline{$i}); 5853 5854 # Quit if the user hit interrupt. 5855 if ($signal) { 5856 last BREAKPOINTS_SCAN; 5857 } 5858 } ## end if (defined $dbline{$i... 5859 } ## end for my $i (1 .. $max) 5860 } ## end for my $file (keys %had_breakpoints) 5861 5862 return; 5863} 5864 5865sub _cmd_L_handle_postponed_breakpoints { 5866 my ($handle_db_line) = @_; 5867 5868 print {$OUT} "Postponed breakpoints in files:\n"; 5869 5870 POSTPONED_SCANS: 5871 for my $file ( keys %postponed_file ) { 5872 my $db = $postponed_file{$file}; 5873 print {$OUT} " $file:\n"; 5874 for my $line ( sort { $a <=> $b } keys %$db ) { 5875 print {$OUT} " $line:\n"; 5876 5877 $handle_db_line->($db->{$line}); 5878 5879 if ($signal) { 5880 last POSTPONED_SCANS; 5881 } 5882 } 5883 if ($signal) { 5884 last POSTPONED_SCANS; 5885 } 5886 } 5887 5888 return; 5889} 5890 5891 5892sub cmd_L { 5893 my $cmd = shift; 5894 5895 my ($action_wanted, $break_wanted, $watch_wanted) = 5896 _cmd_L_calc_wanted_flags(shift); 5897 5898 my $handle_db_line = sub { 5899 my ($l) = @_; 5900 5901 my ( $stop, $action ) = split( /\0/, $l ); 5902 5903 if ($stop and $break_wanted) { 5904 print {$OUT} " break if (", $stop, ")\n" 5905 } 5906 5907 if ($action && $action_wanted) { 5908 print {$OUT} " action: ", $action, "\n" 5909 } 5910 5911 return; 5912 }; 5913 5914 # Breaks and actions are found together, so we look in the same place 5915 # for both. 5916 if ( $break_wanted or $action_wanted ) { 5917 _cmd_L_handle_breakpoints($handle_db_line); 5918 } 5919 5920 # Look for breaks in not-yet-compiled subs: 5921 if ( %postponed and $break_wanted ) { 5922 print {$OUT} "Postponed breakpoints in subroutines:\n"; 5923 my $subname; 5924 SUBS_SCAN: 5925 for $subname ( keys %postponed ) { 5926 print {$OUT} " $subname\t$postponed{$subname}\n"; 5927 if ($signal) { 5928 last SUBS_SCAN; 5929 } 5930 } 5931 } ## end if (%postponed and $break_wanted) 5932 5933 # Find files that have not-yet-loaded breaks: 5934 my @have = map { # Combined keys 5935 keys %{ $postponed_file{$_} } 5936 } keys %postponed_file; 5937 5938 # If there are any, list them. 5939 if ( @have and ( $break_wanted or $action_wanted ) ) { 5940 _cmd_L_handle_postponed_breakpoints($handle_db_line); 5941 } ## end if (@have and ($break_wanted... 5942 5943 if ( %break_on_load and $break_wanted ) { 5944 print {$OUT} "Breakpoints on load:\n"; 5945 BREAK_ON_LOAD: for my $filename ( keys %break_on_load ) { 5946 print {$OUT} " $filename\n"; 5947 last BREAK_ON_LOAD if $signal; 5948 } 5949 } ## end if (%break_on_load and... 5950 5951 if ($watch_wanted and ( $trace & 2 )) { 5952 print {$OUT} "Watch-expressions:\n" if @to_watch; 5953 TO_WATCH: for my $expr (@to_watch) { 5954 print {$OUT} " $expr\n"; 5955 last TO_WATCH if $signal; 5956 } 5957 } 5958 5959 return; 5960} ## end sub cmd_L 5961 5962=head3 C<cmd_M> - list modules (command) 5963 5964Just call C<list_modules>. 5965 5966=cut 5967 5968sub cmd_M { 5969 list_modules(); 5970 5971 return; 5972} 5973 5974=head3 C<cmd_o> - options (command) 5975 5976If this is just C<o> by itself, we list the current settings via 5977C<dump_option>. If there's a nonblank value following it, we pass that on to 5978C<parse_options> for processing. 5979 5980=cut 5981 5982sub cmd_o { 5983 my $cmd = shift; 5984 my $opt = shift || ''; # opt[=val] 5985 5986 # Nonblank. Try to parse and process. 5987 if ( $opt =~ /^(\S.*)/ ) { 5988 parse_options($1); 5989 } 5990 5991 # Blank. List the current option settings. 5992 else { 5993 for (@options) { 5994 dump_option($_); 5995 } 5996 } 5997} ## end sub cmd_o 5998 5999=head3 C<cmd_O> - nonexistent in 5.8.x (command) 6000 6001Advises the user that the O command has been renamed. 6002 6003=cut 6004 6005sub cmd_O { 6006 print $OUT "The old O command is now the o command.\n"; # hint 6007 print $OUT "Use 'h' to get current command help synopsis or\n"; # 6008 print $OUT "use 'o CommandSet=pre580' to revert to old usage\n"; # 6009} 6010 6011=head3 C<cmd_v> - view window (command) 6012 6013Uses the C<$preview> variable set in the second C<BEGIN> block (q.v.) to 6014move back a few lines to list the selected line in context. Uses C<cmd_l> 6015to do the actual listing after figuring out the range of line to request. 6016 6017=cut 6018 6019use vars qw($preview); 6020 6021sub cmd_v { 6022 my $cmd = shift; 6023 my $line = shift; 6024 6025 # Extract the line to list around. (Astute readers will have noted that 6026 # this pattern will match whether or not a numeric line is specified, 6027 # which means that we'll always enter this loop (though a non-numeric 6028 # argument results in no action at all)). 6029 if ( $line =~ /^(\d*)$/ ) { 6030 6031 # Total number of lines to list (a windowful). 6032 $incr = $window - 1; 6033 6034 # Set the start to the argument given (if there was one). 6035 $start = $1 if $1; 6036 6037 # Back up by the context amount. 6038 $start -= $preview; 6039 6040 # Put together a linespec that cmd_l will like. 6041 $line = $start . '-' . ( $start + $incr ); 6042 6043 # List the lines. 6044 cmd_l( 'l', $line ); 6045 } ## end if ($line =~ /^(\d*)$/) 6046} ## end sub cmd_v 6047 6048=head3 C<cmd_w> - add a watch expression (command) 6049 6050The 5.8 version of this command adds a watch expression if one is specified; 6051it does nothing if entered with no operands. 6052 6053We extract the expression, save it, evaluate it in the user's context, and 6054save the value. We'll re-evaluate it each time the debugger passes a line, 6055and will stop (see the code at the top of the command loop) if the value 6056of any of the expressions changes. 6057 6058=cut 6059 6060sub _add_watch_expr { 6061 my $expr = shift; 6062 6063 # ... save it. 6064 push @to_watch, $expr; 6065 6066 # Parameterize DB::eval and call it to get the expression's value 6067 # in the user's context. This version can handle expressions which 6068 # return a list value. 6069 $evalarg = $expr; 6070 # The &-call is here to ascertain the mutability of @_. 6071 my ($val) = join( ' ', &DB::eval); 6072 $val = ( defined $val ) ? "'$val'" : 'undef'; 6073 6074 # Save the current value of the expression. 6075 push @old_watch, $val; 6076 6077 # We are now watching expressions. 6078 $trace |= 2; 6079 6080 return; 6081} 6082 6083sub cmd_w { 6084 my $cmd = shift; 6085 6086 # Null expression if no arguments. 6087 my $expr = shift || ''; 6088 6089 # If expression is not null ... 6090 if ( $expr =~ /\A\S/ ) { 6091 _add_watch_expr($expr); 6092 } ## end if ($expr =~ /^(\S.*)/) 6093 6094 # You have to give one to get one. 6095 else { 6096 print $OUT "Adding a watch-expression requires an expression\n"; # hint 6097 } 6098 6099 return; 6100} 6101 6102=head3 C<cmd_W> - delete watch expressions (command) 6103 6104This command accepts either a watch expression to be removed from the list 6105of watch expressions, or C<*> to delete them all. 6106 6107If C<*> is specified, we simply empty the watch expression list and the 6108watch expression value list. We also turn off the bit that says we've got 6109watch expressions. 6110 6111If an expression (or partial expression) is specified, we pattern-match 6112through the expressions and remove the ones that match. We also discard 6113the corresponding values. If no watch expressions are left, we turn off 6114the I<watching expressions> bit. 6115 6116=cut 6117 6118sub cmd_W { 6119 my $cmd = shift; 6120 my $expr = shift || ''; 6121 6122 # Delete them all. 6123 if ( $expr eq '*' ) { 6124 6125 # Not watching now. 6126 $trace &= ~2; 6127 6128 print $OUT "Deleting all watch expressions ...\n"; 6129 6130 # And all gone. 6131 @to_watch = @old_watch = (); 6132 } 6133 6134 # Delete one of them. 6135 elsif ( $expr =~ /^(\S.*)/ ) { 6136 6137 # Where we are in the list. 6138 my $i_cnt = 0; 6139 6140 # For each expression ... 6141 foreach (@to_watch) { 6142 my $val = $to_watch[$i_cnt]; 6143 6144 # Does this one match the command argument? 6145 if ( $val eq $expr ) { # =~ m/^\Q$i$/) { 6146 # Yes. Turn it off, and its value too. 6147 splice( @to_watch, $i_cnt, 1 ); 6148 splice( @old_watch, $i_cnt, 1 ); 6149 } 6150 $i_cnt++; 6151 } ## end foreach (@to_watch) 6152 6153 # We don't bother to turn watching off because 6154 # a) we don't want to stop calling watchfunction() if it exists 6155 # b) foreach over a null list doesn't do anything anyway 6156 6157 } ## end elsif ($expr =~ /^(\S.*)/) 6158 6159 # No command arguments entered. 6160 else { 6161 print $OUT 6162 "Deleting a watch-expression requires an expression, or '*' for all\n" 6163 ; # hint 6164 } 6165} ## end sub cmd_W 6166 6167### END of the API section 6168 6169=head1 SUPPORT ROUTINES 6170 6171These are general support routines that are used in a number of places 6172throughout the debugger. 6173 6174=head2 save 6175 6176save() saves the user's versions of globals that would mess us up in C<@saved>, 6177and installs the versions we like better. 6178 6179=cut 6180 6181sub save { 6182 6183 # Save eval failure, command failure, extended OS error, output field 6184 # separator, input record separator, output record separator and 6185 # the warning setting. 6186 @saved = ( $@, $!, $^E, $,, $/, $\, $^W ); 6187 6188 $, = ""; # output field separator is null string 6189 $/ = "\n"; # input record separator is newline 6190 $\ = ""; # output record separator is null string 6191 $^W = 0; # warnings are off 6192} ## end sub save 6193 6194=head2 C<print_lineinfo> - show where we are now 6195 6196print_lineinfo prints whatever it is that it is handed; it prints it to the 6197C<$LINEINFO> filehandle instead of just printing it to STDOUT. This allows 6198us to feed line information to a slave editor without messing up the 6199debugger output. 6200 6201=cut 6202 6203sub print_lineinfo { 6204 6205 # Make the terminal sensible if we're not the primary debugger. 6206 resetterm(1) if $LINEINFO eq $OUT and $term_pid != $$; 6207 local $\ = ''; 6208 local $, = ''; 6209 # $LINEINFO may be undef if $noTTY is set or some other issue. 6210 if ($LINEINFO) 6211 { 6212 print {$LINEINFO} @_; 6213 } 6214} ## end sub print_lineinfo 6215 6216=head2 C<postponed_sub> 6217 6218Handles setting postponed breakpoints in subroutines once they're compiled. 6219For breakpoints, we use C<DB::find_sub> to locate the source file and line 6220range for the subroutine, then mark the file as having a breakpoint, 6221temporarily switch the C<*dbline> glob over to the source file, and then 6222search the given range of lines to find a breakable line. If we find one, 6223we set the breakpoint on it, deleting the breakpoint from C<%postponed>. 6224 6225=cut 6226 6227# The following takes its argument via $evalarg to preserve current @_ 6228 6229sub postponed_sub { 6230 6231 # Get the subroutine name. 6232 my $subname = shift; 6233 6234 # If this is a 'break +<n> if <condition>' ... 6235 if ( $postponed{$subname} =~ s/^break\s([+-]?\d+)\s+if\s// ) { 6236 6237 # If there's no offset, use '+0'. 6238 my $offset = $1 || 0; 6239 6240 # find_sub's value is 'fullpath-filename:start-stop'. It's 6241 # possible that the filename might have colons in it too. 6242 my ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(\d+)-.*$/ ); 6243 if ($i) { 6244 6245 # We got the start line. Add the offset '+<n>' from 6246 # $postponed{subname}. 6247 $i += $offset; 6248 6249 # Switch to the file this sub is in, temporarily. 6250 local *dbline = $main::{ '_<' . $file }; 6251 6252 # No warnings, please. 6253 local $^W = 0; # != 0 is magical below 6254 6255 # This file's got a breakpoint in it. 6256 $had_breakpoints{$file} |= 1; 6257 6258 # Last line in file. 6259 $max = $#dbline; 6260 6261 # Search forward until we hit a breakable line or get to 6262 # the end of the file. 6263 ++$i until $dbline[$i] != 0 or $i >= $max; 6264 6265 # Copy the breakpoint in and delete it from %postponed. 6266 $dbline{$i} = delete $postponed{$subname}; 6267 } ## end if ($i) 6268 6269 # find_sub didn't find the sub. 6270 else { 6271 local $\ = ''; 6272 print $OUT "Subroutine $subname not found.\n"; 6273 } 6274 return; 6275 } ## end if ($postponed{$subname... 6276 elsif ( $postponed{$subname} eq 'compile' ) { $signal = 1 } 6277 6278 #print $OUT "In postponed_sub for '$subname'.\n"; 6279} ## end sub postponed_sub 6280 6281=head2 C<postponed> 6282 6283Called after each required file is compiled, but before it is executed; 6284also called if the name of a just-compiled subroutine is a key of 6285C<%postponed>. Propagates saved breakpoints (from C<b compile>, C<b load>, 6286etc.) into the just-compiled code. 6287 6288If this is a C<require>'d file, the incoming parameter is the glob 6289C<*{"_<$filename"}>, with C<$filename> the name of the C<require>'d file. 6290 6291If it's a subroutine, the incoming parameter is the subroutine name. 6292 6293=cut 6294 6295sub postponed { 6296 6297 # If there's a break, process it. 6298 if ($ImmediateStop) { 6299 6300 # Right, we've stopped. Turn it off. 6301 $ImmediateStop = 0; 6302 6303 # Enter the command loop when DB::DB gets called. 6304 $signal = 1; 6305 } 6306 6307 # If this is a subroutine, let postponed_sub() deal with it. 6308 if (ref(\$_[0]) ne 'GLOB') { 6309 return postponed_sub(@_); 6310 } 6311 6312 # Not a subroutine. Deal with the file. 6313 local *dbline = shift; 6314 my $filename = $dbline; 6315 $filename =~ s/^_<//; 6316 local $\ = ''; 6317 $signal = 1, print $OUT "'$filename' loaded...\n" 6318 if $break_on_load{$filename}; 6319 print_lineinfo( ' ' x $stack_depth, "Package $filename.\n" ) if $frame; 6320 6321 # Do we have any breakpoints to put in this file? 6322 return unless $postponed_file{$filename}; 6323 6324 # Yes. Mark this file as having breakpoints. 6325 $had_breakpoints{$filename} |= 1; 6326 6327 # "Cannot be done: insufficient magic" - we can't just put the 6328 # breakpoints saved in %postponed_file into %dbline by assigning 6329 # the whole hash; we have to do it one item at a time for the 6330 # breakpoints to be set properly. 6331 #%dbline = %{$postponed_file{$filename}}; 6332 6333 # Set the breakpoints, one at a time. 6334 my $key; 6335 6336 for $key ( keys %{ $postponed_file{$filename} } ) { 6337 6338 # Stash the saved breakpoint into the current file's magic line array. 6339 $dbline{$key} = ${ $postponed_file{$filename} }{$key}; 6340 } 6341 6342 # This file's been compiled; discard the stored breakpoints. 6343 delete $postponed_file{$filename}; 6344 6345} ## end sub postponed 6346 6347=head2 C<dumpit> 6348 6349C<dumpit> is the debugger's wrapper around dumpvar.pl. 6350 6351It gets a filehandle (to which C<dumpvar.pl>'s output will be directed) and 6352a reference to a variable (the thing to be dumped) as its input. 6353 6354The incoming filehandle is selected for output (C<dumpvar.pl> is printing to 6355the currently-selected filehandle, thank you very much). The current 6356values of the package globals C<$single> and C<$trace> are backed up in 6357lexicals, and they are turned off (this keeps the debugger from trying 6358to single-step through C<dumpvar.pl> (I think.)). C<$frame> is localized to 6359preserve its current value and it is set to zero to prevent entry/exit 6360messages from printing, and C<$doret> is localized as well and set to -2 to 6361prevent return values from being shown. 6362 6363C<dumpit()> then checks to see if it needs to load C<dumpvar.pl> and 6364tries to load it (note: if you have a C<dumpvar.pl> ahead of the 6365installed version in C<@INC>, yours will be used instead. Possible security 6366problem?). 6367 6368It then checks to see if the subroutine C<main::dumpValue> is now defined 6369it should have been defined by C<dumpvar.pl>). If it has, C<dumpit()> 6370localizes the globals necessary for things to be sane when C<main::dumpValue()> 6371is called, and picks up the variable to be dumped from the parameter list. 6372 6373It checks the package global C<%options> to see if there's a C<dumpDepth> 6374specified. If not, -1 is assumed; if so, the supplied value gets passed on to 6375C<dumpvar.pl>. This tells C<dumpvar.pl> where to leave off when dumping a 6376structure: -1 means dump everything. 6377 6378C<dumpValue()> is then called if possible; if not, C<dumpit()>just prints a 6379warning. 6380 6381In either case, C<$single>, C<$trace>, C<$frame>, and C<$doret> are restored 6382and we then return to the caller. 6383 6384=cut 6385 6386sub dumpit { 6387 6388 # Save the current output filehandle and switch to the one 6389 # passed in as the first parameter. 6390 my $savout = select(shift); 6391 6392 # Save current settings of $single and $trace, and then turn them off. 6393 my $osingle = $single; 6394 my $otrace = $trace; 6395 $single = $trace = 0; 6396 6397 # XXX Okay, what do $frame and $doret do, again? 6398 local $frame = 0; 6399 local $doret = -2; 6400 6401 # Load dumpvar.pl unless we've already got the sub we need from it. 6402 unless ( defined &main::dumpValue ) { 6403 do 'dumpvar.pl' or die $@; 6404 } 6405 6406 # If the load succeeded (or we already had dumpvalue()), go ahead 6407 # and dump things. 6408 if ( defined &main::dumpValue ) { 6409 local $\ = ''; 6410 local $, = ''; 6411 local $" = ' '; 6412 my $v = shift; 6413 my $maxdepth = shift || $option{dumpDepth}; 6414 $maxdepth = -1 unless defined $maxdepth; # -1 means infinite depth 6415 main::dumpValue( $v, $maxdepth ); 6416 } ## end if (defined &main::dumpValue) 6417 6418 # Oops, couldn't load dumpvar.pl. 6419 else { 6420 local $\ = ''; 6421 print $OUT "dumpvar.pl not available.\n"; 6422 } 6423 6424 # Reset $single and $trace to their old values. 6425 $single = $osingle; 6426 $trace = $otrace; 6427 6428 # Restore the old filehandle. 6429 select($savout); 6430} ## end sub dumpit 6431 6432=head2 C<print_trace> 6433 6434C<print_trace>'s job is to print a stack trace. It does this via the 6435C<dump_trace> routine, which actually does all the ferreting-out of the 6436stack trace data. C<print_trace> takes care of formatting it nicely and 6437printing it to the proper filehandle. 6438 6439Parameters: 6440 6441=over 4 6442 6443=item * 6444 6445The filehandle to print to. 6446 6447=item * 6448 6449How many frames to skip before starting trace. 6450 6451=item * 6452 6453How many frames to print. 6454 6455=item * 6456 6457A flag: if true, print a I<short> trace without filenames, line numbers, or arguments 6458 6459=back 6460 6461The original comment below seems to be noting that the traceback may not be 6462correct if this routine is called in a tied method. 6463 6464=cut 6465 6466# Tied method do not create a context, so may get wrong message: 6467 6468sub print_trace { 6469 local $\ = ''; 6470 my $fh = shift; 6471 6472 # If this is going to a slave editor, but we're not the primary 6473 # debugger, reset it first. 6474 resetterm(1) 6475 if $fh eq $LINEINFO # slave editor 6476 and $LINEINFO eq $OUT # normal output 6477 and $term_pid != $$; # not the primary 6478 6479 # Collect the actual trace information to be formatted. 6480 # This is an array of hashes of subroutine call info. 6481 my @sub = dump_trace( $_[0] + 1, $_[1] ); 6482 6483 # Grab the "short report" flag from @_. 6484 my $short = $_[2]; # Print short report, next one for sub name 6485 6486 # Run through the traceback info, format it, and print it. 6487 my $s; 6488 for my $i (0 .. $#sub) { 6489 6490 # Drop out if the user has lost interest and hit control-C. 6491 last if $signal; 6492 6493 # Set the separator so arrays print nice. 6494 local $" = ', '; 6495 6496 # Grab and stringify the arguments if they are there. 6497 my $args = 6498 defined $sub[$i]{args} 6499 ? "(@{ $sub[$i]{args} })" 6500 : ''; 6501 6502 # Shorten them up if $maxtrace says they're too long. 6503 $args = ( substr $args, 0, $maxtrace - 3 ) . '...' 6504 if length $args > $maxtrace; 6505 6506 # Get the file name. 6507 my $file = $sub[$i]{file}; 6508 6509 # Put in a filename header if short is off. 6510 $file = $file eq '-e' ? $file : "file '$file'" unless $short; 6511 6512 # Get the actual sub's name, and shorten to $maxtrace's requirement. 6513 $s = $sub[$i]{'sub'}; 6514 $s = ( substr $s, 0, $maxtrace - 3 ) . '...' if length $s > $maxtrace; 6515 6516 # Short report uses trimmed file and sub names. 6517 if ($short) { 6518 my $sub = @_ >= 4 ? $_[3] : $s; 6519 print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n"; 6520 } ## end if ($short) 6521 6522 # Non-short report includes full names. 6523 else { 6524 print $fh "$sub[$i]{context} = $s$args" 6525 . " called from $file" 6526 . " line $sub[$i]{line}\n"; 6527 } 6528 } ## end for my $i (0 .. $#sub) 6529} ## end sub print_trace 6530 6531=head2 dump_trace(skip[,count]) 6532 6533Actually collect the traceback information available via C<caller()>. It does 6534some filtering and cleanup of the data, but mostly it just collects it to 6535make C<print_trace()>'s job easier. 6536 6537C<skip> defines the number of stack frames to be skipped, working backwards 6538from the most current. C<count> determines the total number of frames to 6539be returned; all of them (well, the first 10^9) are returned if C<count> 6540is omitted. 6541 6542This routine returns a list of hashes, from most-recent to least-recent 6543stack frame. Each has the following keys and values: 6544 6545=over 4 6546 6547=item * C<context> - C<.> (null), C<$> (scalar), or C<@> (array) 6548 6549=item * C<sub> - subroutine name, or C<eval> information 6550 6551=item * C<args> - undef, or a reference to an array of arguments 6552 6553=item * C<file> - the file in which this item was defined (if any) 6554 6555=item * C<line> - the line on which it was defined 6556 6557=back 6558 6559=cut 6560 6561sub _dump_trace_calc_saved_single_arg 6562{ 6563 my ($nothard, $arg) = @_; 6564 6565 my $type; 6566 if ( not defined $arg ) { # undefined parameter 6567 return "undef"; 6568 } 6569 6570 elsif ( $nothard and tied $arg ) { # tied parameter 6571 return "tied"; 6572 } 6573 elsif ( $nothard and $type = ref $arg ) { # reference 6574 return "ref($type)"; 6575 } 6576 else { # can be stringified 6577 local $_ = 6578 "$arg"; # Safe to stringify now - should not call f(). 6579 6580 # Backslash any single-quotes or backslashes. 6581 s/([\'\\])/\\$1/g; 6582 6583 # Single-quote it unless it's a number or a colon-separated 6584 # name. 6585 s/(.*)/'$1'/s 6586 unless /^(?: -?[\d.]+ | \*[\w:]* )$/x; 6587 6588 # Turn high-bit characters into meta-whatever, and controls into like 6589 # '^D'. 6590 require 'meta_notation.pm'; 6591 $_ = _meta_notation($_) if /[[:^print:]]/a; 6592 6593 return $_; 6594 } 6595} 6596 6597sub _dump_trace_calc_save_args { 6598 my ($nothard) = @_; 6599 6600 return [ 6601 map { _dump_trace_calc_saved_single_arg($nothard, $_) } @args 6602 ]; 6603} 6604 6605sub dump_trace { 6606 6607 # How many levels to skip. 6608 my $skip = shift; 6609 6610 # How many levels to show. (1e9 is a cheap way of saying "all of them"; 6611 # it's unlikely that we'll have more than a billion stack frames. If you 6612 # do, you've got an awfully big machine...) 6613 my $count = shift || 1e9; 6614 6615 # We increment skip because caller(1) is the first level *back* from 6616 # the current one. Add $skip to the count of frames so we have a 6617 # simple stop criterion, counting from $skip to $count+$skip. 6618 $skip++; 6619 $count += $skip; 6620 6621 # These variables are used to capture output from caller(); 6622 my ( $p, $file, $line, $sub, $h, $context ); 6623 6624 my ( $e, $r, @sub, $args ); 6625 6626 # XXX Okay... why'd we do that? 6627 my $nothard = not $frame & 8; 6628 local $frame = 0; 6629 6630 # Do not want to trace this. 6631 my $otrace = $trace; 6632 $trace = 0; 6633 6634 # Start out at the skip count. 6635 # If we haven't reached the number of frames requested, and caller() is 6636 # still returning something, stay in the loop. (If we pass the requested 6637 # number of stack frames, or we run out - caller() returns nothing - we 6638 # quit. 6639 # Up the stack frame index to go back one more level each time. 6640 for ( 6641 my $i = $skip ; 6642 $i < $count 6643 and ( $p, $file, $line, $sub, $h, $context, $e, $r ) = caller($i) ; 6644 $i++ 6645 ) 6646 { 6647 # if the sub has args ($h true), make an anonymous array of the 6648 # dumped args. 6649 my $args = $h ? _dump_trace_calc_save_args($nothard) : undef; 6650 6651 # If context is true, this is array (@)context. 6652 # If context is false, this is scalar ($) context. 6653 # If neither, context isn't defined. (This is apparently a 'can't 6654 # happen' trap.) 6655 $context = $context ? '@' : ( defined $context ? "\$" : '.' ); 6656 6657 # remove trailing newline-whitespace-semicolon-end of line sequence 6658 # from the eval text, if any. 6659 $e =~ s/\n\s*\;\s*\Z// if $e; 6660 6661 # Escape backslashed single-quotes again if necessary. 6662 $e =~ s/([\\\'])/\\$1/g if $e; 6663 6664 # if the require flag is true, the eval text is from a require. 6665 if ($r) { 6666 $sub = "require '$e'"; 6667 } 6668 6669 # if it's false, the eval text is really from an eval. 6670 elsif ( defined $r ) { 6671 $sub = "eval '$e'"; 6672 } 6673 6674 # If the sub is '(eval)', this is a block eval, meaning we don't 6675 # know what the eval'ed text actually was. 6676 elsif ( $sub eq '(eval)' ) { 6677 $sub = "eval {...}"; 6678 } 6679 6680 # Stick the collected information into @sub as an anonymous hash. 6681 push( 6682 @sub, 6683 { 6684 context => $context, 6685 sub => $sub, 6686 args => $args, 6687 file => $file, 6688 line => $line 6689 } 6690 ); 6691 6692 # Stop processing frames if the user hit control-C. 6693 last if $signal; 6694 } ## end for ($i = $skip ; $i < ... 6695 6696 # Restore the trace value again. 6697 $trace = $otrace; 6698 @sub; 6699} ## end sub dump_trace 6700 6701=head2 C<action()> 6702 6703C<action()> takes input provided as the argument to an add-action command, 6704either pre- or post-, and makes sure it's a complete command. It doesn't do 6705any fancy parsing; it just keeps reading input until it gets a string 6706without a trailing backslash. 6707 6708=cut 6709 6710sub action { 6711 my $action = shift; 6712 6713 while ( $action =~ s/\\$// ) { 6714 6715 # We have a backslash on the end. Read more. 6716 $action .= gets(); 6717 } ## end while ($action =~ s/\\$//) 6718 6719 # Return the assembled action. 6720 $action; 6721} ## end sub action 6722 6723=head2 unbalanced 6724 6725This routine mostly just packages up a regular expression to be used 6726to check that the thing it's being matched against has properly-matched 6727curly braces. 6728 6729Of note is the definition of the C<$balanced_brace_re> global via C<||=>, which 6730speeds things up by only creating the qr//'ed expression once; if it's 6731already defined, we don't try to define it again. A speed hack. 6732 6733=cut 6734 6735use vars qw($balanced_brace_re); 6736 6737sub unbalanced { 6738 6739 # I hate using globals! 6740 $balanced_brace_re ||= qr{ 6741 ^ \{ 6742 (?: 6743 (?> [^{}] + ) # Non-parens without backtracking 6744 | 6745 (??{ $balanced_brace_re }) # Group with matching parens 6746 ) * 6747 \} $ 6748 }x; 6749 return $_[0] !~ m/$balanced_brace_re/; 6750} ## end sub unbalanced 6751 6752=head2 C<gets()> 6753 6754C<gets()> is a primitive (very primitive) routine to read continuations. 6755It was devised for reading continuations for actions. 6756it just reads more input with C<readline()> and returns it. 6757 6758=cut 6759 6760sub gets { 6761 return DB::readline("cont: "); 6762} 6763 6764=head2 C<_db_system()> - handle calls to<system()> without messing up the debugger 6765 6766The C<system()> function assumes that it can just go ahead and use STDIN and 6767STDOUT, but under the debugger, we want it to use the debugger's input and 6768outout filehandles. 6769 6770C<_db_system()> socks away the program's STDIN and STDOUT, and then substitutes 6771the debugger's IN and OUT filehandles for them. It does the C<system()> call, 6772and then puts everything back again. 6773 6774=cut 6775 6776sub _db_system { 6777 6778 # We save, change, then restore STDIN and STDOUT to avoid fork() since 6779 # some non-Unix systems can do system() but have problems with fork(). 6780 open( SAVEIN, "<&STDIN" ) || _db_warn("Can't save STDIN"); 6781 open( SAVEOUT, ">&STDOUT" ) || _db_warn("Can't save STDOUT"); 6782 open( STDIN, "<&IN" ) || _db_warn("Can't redirect STDIN"); 6783 open( STDOUT, ">&OUT" ) || _db_warn("Can't redirect STDOUT"); 6784 6785 # XXX: using csh or tcsh destroys sigint retvals! 6786 system(@_); 6787 open( STDIN, "<&SAVEIN" ) || _db_warn("Can't restore STDIN"); 6788 open( STDOUT, ">&SAVEOUT" ) || _db_warn("Can't restore STDOUT"); 6789 close(SAVEIN); 6790 close(SAVEOUT); 6791 6792 # most of the $? crud was coping with broken cshisms 6793 if ( $? >> 8 ) { 6794 _db_warn( "(Command exited ", ( $? >> 8 ), ")\n" ); 6795 } 6796 elsif ($?) { 6797 _db_warn( 6798 "(Command died of SIG#", 6799 ( $? & 127 ), 6800 ( ( $? & 128 ) ? " -- core dumped" : "" ), 6801 ")", "\n" 6802 ); 6803 } ## end elsif ($?) 6804 6805 return $?; 6806 6807} ## end sub system 6808 6809*system = \&_db_system; 6810 6811=head1 TTY MANAGEMENT 6812 6813The subs here do some of the terminal management for multiple debuggers. 6814 6815=head2 setterm 6816 6817Top-level function called when we want to set up a new terminal for use 6818by the debugger. 6819 6820If the C<noTTY> debugger option was set, we'll either use the terminal 6821supplied (the value of the C<noTTY> option), or we'll use C<Term::Rendezvous> 6822to find one. If we're a forked debugger, we call C<resetterm> to try to 6823get a whole new terminal if we can. 6824 6825In either case, we set up the terminal next. If the C<ReadLine> option was 6826true, we'll get a C<Term::ReadLine> object for the current terminal and save 6827the appropriate attributes. We then 6828 6829=cut 6830 6831use vars qw($ornaments); 6832use vars qw($rl_attribs); 6833sub setterm { 6834 6835 # Load Term::Readline, but quietly; don't debug it and don't trace it. 6836 local $frame = 0; 6837 local $doret = -2; 6838 _DB__use_full_path(sub { 6839 require Term::ReadLine; 6840 }); 6841 6842 6843 # If noTTY is set, but we have a TTY name, go ahead and hook up to it. 6844 if ($notty) { 6845 if ($tty) { 6846 my ( $i, $o ) = split $tty, /,/; 6847 $o = $i unless defined $o; 6848 open( IN, '<', $i ) or die "Cannot open TTY '$i' for read: $!"; 6849 open( OUT, '>', $o ) or die "Cannot open TTY '$o' for write: $!"; 6850 $IN = \*IN; 6851 $OUT = \*OUT; 6852 _autoflush($OUT); 6853 } ## end if ($tty) 6854 6855 # We don't have a TTY - try to find one via Term::Rendezvous. 6856 else { 6857 require Term::Rendezvous; 6858 6859 # See if we have anything to pass to Term::Rendezvous. 6860 # Use $HOME/.perldbtty$$ if not. 6861 my $rv = $ENV{PERLDB_NOTTY} || "$ENV{HOME}/.perldbtty$$"; 6862 6863 # Rendezvous and get the filehandles. 6864 my $term_rv = Term::Rendezvous->new( $rv ); 6865 $IN = $term_rv->IN; 6866 $OUT = $term_rv->OUT; 6867 } ## end else [ if ($tty) 6868 } ## end if ($notty) 6869 6870 # We're a daughter debugger. Try to fork off another TTY. 6871 if ( $term_pid eq '-1' ) { # In a TTY with another debugger 6872 resetterm(2); 6873 } 6874 6875 # If we shouldn't use Term::ReadLine, don't. 6876 if ( !$rl ) { 6877 $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT ); 6878 } 6879 6880 # We're using Term::ReadLine. Get all the attributes for this terminal. 6881 else { 6882 $term = Term::ReadLine->new( 'perldb', $IN, $OUT ); 6883 6884 $rl_attribs = $term->Attribs; 6885 $rl_attribs->{basic_word_break_characters} .= '-:+/*,[])}' 6886 if defined $rl_attribs->{basic_word_break_characters} 6887 and index( $rl_attribs->{basic_word_break_characters}, ":" ) == -1; 6888 $rl_attribs->{special_prefixes} = '$@&%'; 6889 $rl_attribs->{completer_word_break_characters} .= '$@&%'; 6890 $rl_attribs->{completion_function} = \&db_complete; 6891 } ## end else [ if (!$rl) 6892 6893 # Set up the LINEINFO filehandle. 6894 $LINEINFO = $OUT unless defined $LINEINFO; 6895 $lineinfo = $console unless defined $lineinfo; 6896 6897 $term->MinLine(2); 6898 6899 load_hist(); 6900 6901 if ( $term->Features->{setHistory} and "@hist" ne "?" ) { 6902 $term->SetHistory(@hist); 6903 } 6904 6905 # XXX Ornaments are turned on unconditionally, which is not 6906 # always a good thing. 6907 ornaments($ornaments) if defined $ornaments; 6908 $term_pid = $$; 6909} ## end sub setterm 6910 6911sub load_hist { 6912 $histfile //= option_val("HistFile", undef); 6913 return unless defined $histfile; 6914 open my $fh, "<", $histfile or return; 6915 local $/ = "\n"; 6916 @hist = (); 6917 while (<$fh>) { 6918 chomp; 6919 push @hist, $_; 6920 } 6921 close $fh; 6922} 6923 6924sub save_hist { 6925 return unless defined $histfile; 6926 eval { require File::Path } or return; 6927 eval { require File::Basename } or return; 6928 File::Path::mkpath(File::Basename::dirname($histfile)); 6929 open my $fh, ">", $histfile or die "Could not open '$histfile': $!"; 6930 $histsize //= option_val("HistSize",100); 6931 my @copy = grep { $_ ne '?' } @hist; 6932 my $start = scalar(@copy) > $histsize ? scalar(@copy)-$histsize : 0; 6933 for ($start .. $#copy) { 6934 print $fh "$copy[$_]\n"; 6935 } 6936 close $fh or die "Could not write '$histfile': $!"; 6937} 6938 6939=head1 GET_FORK_TTY EXAMPLE FUNCTIONS 6940 6941When the process being debugged forks, or the process invokes a command 6942via C<system()> which starts a new debugger, we need to be able to get a new 6943C<IN> and C<OUT> filehandle for the new debugger. Otherwise, the two processes 6944fight over the terminal, and you can never quite be sure who's going to get the 6945input you're typing. 6946 6947C<get_fork_TTY> is a glob-aliased function which calls the real function that 6948is tasked with doing all the necessary operating system mojo to get a new 6949TTY (and probably another window) and to direct the new debugger to read and 6950write there. 6951 6952The debugger provides C<get_fork_TTY> functions which work for TCP 6953socket servers, X11, OS/2, and Mac OS X. Other systems are not 6954supported. You are encouraged to write C<get_fork_TTY> functions which 6955work for I<your> platform and contribute them. 6956 6957=head3 C<socket_get_fork_TTY> 6958 6959=cut 6960 6961sub connect_remoteport { 6962 require IO::Socket; 6963 6964 my $socket = IO::Socket::INET->new( 6965 Timeout => '10', 6966 PeerAddr => $remoteport, 6967 Proto => 'tcp', 6968 ); 6969 if ( ! $socket ) { 6970 die "Unable to connect to remote host: $remoteport\n"; 6971 } 6972 return $socket; 6973} 6974 6975sub socket_get_fork_TTY { 6976 $tty = $LINEINFO = $IN = $OUT = connect_remoteport(); 6977 6978 # Do I need to worry about setting $term? 6979 6980 reset_IN_OUT( $IN, $OUT ); 6981 return ''; 6982} 6983 6984=head3 C<xterm_get_fork_TTY> 6985 6986This function provides the C<get_fork_TTY> function for X11. If a 6987program running under the debugger forks, a new <xterm> window is opened and 6988the subsidiary debugger is directed there. 6989 6990The C<open()> call is of particular note here. We have the new C<xterm> 6991we're spawning route file number 3 to STDOUT, and then execute the C<tty> 6992command (which prints the device name of the TTY we'll want to use for input 6993and output to STDOUT, then C<sleep> for a very long time, routing this output 6994to file number 3. This way we can simply read from the <XT> filehandle (which 6995is STDOUT from the I<commands> we ran) to get the TTY we want to use. 6996 6997Only works if C<xterm> is in your path and C<$ENV{DISPLAY}>, etc. are 6998properly set up. 6999 7000=cut 7001 7002sub xterm_get_fork_TTY { 7003 ( my $name = $0 ) =~ s,^.*[/\\],,s; 7004 open XT, 7005qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\ 7006 sleep 10000000' |]; 7007 7008 # Get the output from 'tty' and clean it up a little. 7009 my $tty = <XT>; 7010 chomp $tty; 7011 7012 $pidprompt = ''; # Shown anyway in titlebar 7013 7014 # We need $term defined or we can not switch to the newly created xterm 7015 if ($tty ne '' && !defined $term) { 7016 _DB__use_full_path(sub { 7017 require Term::ReadLine; 7018 }); 7019 if ( !$rl ) { 7020 $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT ); 7021 } 7022 else { 7023 $term = Term::ReadLine->new( 'perldb', $IN, $OUT ); 7024 } 7025 } 7026 # There's our new TTY. 7027 return $tty; 7028} ## end sub xterm_get_fork_TTY 7029 7030=head3 C<os2_get_fork_TTY> 7031 7032XXX It behooves an OS/2 expert to write the necessary documentation for this! 7033 7034=cut 7035 7036# This example function resets $IN, $OUT itself 7037my $c_pipe = 0; 7038sub os2_get_fork_TTY { # A simplification of the following (and works without): 7039 local $\ = ''; 7040 ( my $name = $0 ) =~ s,^.*[/\\],,s; 7041 my %opt = ( title => "Daughter Perl debugger $pids $name", 7042 ($rl ? (read_by_key => 1) : ()) ); 7043 require OS2::Process; 7044 my ($in, $out, $pid) = eval { OS2::Process::io_term(related => 0, %opt) } 7045 or return; 7046 $pidprompt = ''; # Shown anyway in titlebar 7047 reset_IN_OUT($in, $out); 7048 $tty = '*reset*'; 7049 return ''; # Indicate that reset_IN_OUT is called 7050} ## end sub os2_get_fork_TTY 7051 7052=head3 C<macosx_get_fork_TTY> 7053 7054The Mac OS X version uses AppleScript to tell Terminal.app to create 7055a new window. 7056 7057=cut 7058 7059# Notes about Terminal.app's AppleScript support, 7060# (aka things that might break in future OS versions). 7061# 7062# The "do script" command doesn't return a reference to the new window 7063# it creates, but since it appears frontmost and windows are enumerated 7064# front to back, we can use "first window" === "window 1". 7065# 7066# Since "do script" is implemented by supplying the argument (plus a 7067# return character) as terminal input, there's a potential race condition 7068# where the debugger could beat the shell to reading the command. 7069# To prevent this, we wait for the screen to clear before proceeding. 7070# 7071# 10.3 and 10.4: 7072# There's no direct accessor for the tty device name, so we fiddle 7073# with the window title options until it says what we want. 7074# 7075# 10.5: 7076# There _is_ a direct accessor for the tty device name, _and_ there's 7077# a new possible component of the window title (the name of the settings 7078# set). A separate version is needed. 7079 7080my @script_versions= 7081 7082 ([237, <<'__LEOPARD__'], 7083tell application "Terminal" 7084 do script "clear;exec sleep 100000" 7085 tell first tab of first window 7086 copy tty to thetty 7087 set custom title to "forked perl debugger" 7088 set title displays custom title to true 7089 repeat while (length of first paragraph of (get contents)) > 0 7090 delay 0.1 7091 end repeat 7092 end tell 7093end tell 7094thetty 7095__LEOPARD__ 7096 7097 [100, <<'__JAGUAR_TIGER__'], 7098tell application "Terminal" 7099 do script "clear;exec sleep 100000" 7100 tell first window 7101 set title displays shell path to false 7102 set title displays window size to false 7103 set title displays file name to false 7104 set title displays device name to true 7105 set title displays custom title to true 7106 set custom title to "" 7107 copy "/dev/" & name to thetty 7108 set custom title to "forked perl debugger" 7109 repeat while (length of first paragraph of (get contents)) > 0 7110 delay 0.1 7111 end repeat 7112 end tell 7113end tell 7114thetty 7115__JAGUAR_TIGER__ 7116 7117); 7118 7119sub macosx_get_fork_TTY 7120{ 7121 my($version,$script,$pipe,$tty); 7122 7123 return unless $version=$ENV{TERM_PROGRAM_VERSION}; 7124 foreach my $entry (@script_versions) { 7125 if ($version>=$entry->[0]) { 7126 $script=$entry->[1]; 7127 last; 7128 } 7129 } 7130 return unless defined($script); 7131 return unless open($pipe,'-|','/usr/bin/osascript','-e',$script); 7132 $tty=readline($pipe); 7133 close($pipe); 7134 return unless defined($tty) && $tty =~ m(^/dev/); 7135 chomp $tty; 7136 return $tty; 7137} 7138 7139=head3 C<tmux_get_fork_TTY> 7140 7141Creates a split window for subprocesses when a process running under the 7142perl debugger in Tmux forks. 7143 7144=cut 7145 7146sub tmux_get_fork_TTY { 7147 return unless $ENV{TMUX}; 7148 7149 my $pipe; 7150 7151 my $status = open $pipe, '-|', 'tmux', 'split-window', 7152 '-P', '-F', '#{pane_tty}', 'sleep 100000'; 7153 7154 if ( !$status ) { 7155 return; 7156 } 7157 7158 my $tty = <$pipe>; 7159 close $pipe; 7160 7161 if ( $tty ) { 7162 chomp $tty; 7163 7164 if ( !defined $term ) { 7165 require Term::ReadLine; 7166 if ( !$rl ) { 7167 $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT ); 7168 } 7169 else { 7170 $term = Term::ReadLine->new( 'perldb', $IN, $OUT ); 7171 } 7172 } 7173 } 7174 7175 return $tty; 7176} 7177 7178=head2 C<create_IN_OUT($flags)> 7179 7180Create a new pair of filehandles, pointing to a new TTY. If impossible, 7181try to diagnose why. 7182 7183Flags are: 7184 7185=over 4 7186 7187=item * 1 - Don't know how to create a new TTY. 7188 7189=item * 2 - Debugger has forked, but we can't get a new TTY. 7190 7191=item * 4 - standard debugger startup is happening. 7192 7193=back 7194 7195=cut 7196 7197use vars qw($fork_TTY); 7198 7199sub create_IN_OUT { # Create a window with IN/OUT handles redirected there 7200 7201 # If we know how to get a new TTY, do it! $in will have 7202 # the TTY name if get_fork_TTY works. 7203 my $in = get_fork_TTY(@_) if defined &get_fork_TTY; 7204 7205 # It used to be that 7206 $in = $fork_TTY if defined $fork_TTY; # Backward compatibility 7207 7208 if ( not defined $in ) { 7209 my $why = shift; 7210 7211 # We don't know how. 7212 print_help(<<EOP) if $why == 1; 7213I<#########> Forked, but do not know how to create a new B<TTY>. I<#########> 7214EOP 7215 7216 # Forked debugger. 7217 print_help(<<EOP) if $why == 2; 7218I<#########> Daughter session, do not know how to change a B<TTY>. I<#########> 7219 This may be an asynchronous session, so the parent debugger may be active. 7220EOP 7221 7222 # Note that both debuggers are fighting over the same input. 7223 print_help(<<EOP) if $why != 4; 7224 Since two debuggers fight for the same TTY, input is severely entangled. 7225 7226EOP 7227 print_help(<<EOP); 7228 I know how to switch the output to a different window in xterms, OS/2 7229 consoles, and Mac OS X Terminal.app only. For a manual switch, put the name 7230 of the created I<TTY> in B<\$DB::fork_TTY>, or define a function 7231 B<DB::get_fork_TTY()> returning this. 7232 7233 On I<UNIX>-like systems one can get the name of a I<TTY> for the given window 7234 by typing B<tty>, and disconnect the I<shell> from I<TTY> by B<sleep 1000000>. 7235 7236EOP 7237 } ## end if (not defined $in) 7238 elsif ( $in ne '' ) { 7239 TTY($in); 7240 } 7241 else { 7242 $console = ''; # Indicate no need to open-from-the-console 7243 } 7244 undef $fork_TTY; 7245} ## end sub create_IN_OUT 7246 7247=head2 C<resetterm> 7248 7249Handles rejiggering the prompt when we've forked off a new debugger. 7250 7251If the new debugger happened because of a C<system()> that invoked a 7252program under the debugger, the arrow between the old pid and the new 7253in the prompt has I<two> dashes instead of one. 7254 7255We take the current list of pids and add this one to the end. If there 7256isn't any list yet, we make one up out of the initial pid associated with 7257the terminal and our new pid, sticking an arrow (either one-dashed or 7258two dashed) in between them. 7259 7260If C<CreateTTY> is off, or C<resetterm> was called with no arguments, 7261we don't try to create a new IN and OUT filehandle. Otherwise, we go ahead 7262and try to do that. 7263 7264=cut 7265 7266sub resetterm { # We forked, so we need a different TTY 7267 7268 # Needs to be passed to create_IN_OUT() as well. 7269 my $in = shift; 7270 7271 # resetterm(2): got in here because of a system() starting a debugger. 7272 # resetterm(1): just forked. 7273 my $systemed = $in > 1 ? '-' : ''; 7274 7275 # If there's already a list of pids, add this to the end. 7276 if ($pids) { 7277 $pids =~ s/\]/$systemed->$$]/; 7278 } 7279 7280 # No pid list. Time to make one. 7281 else { 7282 $pids = "[$term_pid->$$]"; 7283 } 7284 7285 # The prompt we're going to be using for this debugger. 7286 $pidprompt = $pids; 7287 7288 # We now 0wnz this terminal. 7289 $term_pid = $$; 7290 7291 # Just return if we're not supposed to try to create a new TTY. 7292 return unless $CreateTTY & $in; 7293 7294 # Try to create a new IN/OUT pair. 7295 create_IN_OUT($in); 7296} ## end sub resetterm 7297 7298=head2 C<readline> 7299 7300First, we handle stuff in the typeahead buffer. If there is any, we shift off 7301the next line, print a message saying we got it, add it to the terminal 7302history (if possible), and return it. 7303 7304If there's nothing in the typeahead buffer, check the command filehandle stack. 7305If there are any filehandles there, read from the last one, and return the line 7306if we got one. If not, we pop the filehandle off and close it, and try the 7307next one up the stack. 7308 7309If we've emptied the filehandle stack, we check to see if we've got a socket 7310open, and we read that and return it if we do. If we don't, we just call the 7311core C<readline()> and return its value. 7312 7313=cut 7314 7315sub readline { 7316 7317 # Localize to prevent it from being smashed in the program being debugged. 7318 local $.; 7319 7320 # If there are stacked filehandles to read from ... 7321 # (Handle it before the typeahead, because we may call source/etc. from 7322 # the typeahead.) 7323 while (@cmdfhs) { 7324 7325 # Read from the last one in the stack. 7326 my $line = CORE::readline( $cmdfhs[-1] ); 7327 7328 # If we got a line ... 7329 defined $line 7330 ? ( print $OUT ">> $line" and return $line ) # Echo and return 7331 : close pop @cmdfhs; # Pop and close 7332 } ## end while (@cmdfhs) 7333 7334 # Pull a line out of the typeahead if there's stuff there. 7335 if (@typeahead) { 7336 7337 # How many lines left. 7338 my $left = @typeahead; 7339 7340 # Get the next line. 7341 my $got = shift @typeahead; 7342 7343 # Print a message saying we got input from the typeahead. 7344 local $\ = ''; 7345 print $OUT "auto(-$left)", shift, $got, "\n"; 7346 7347 # Add it to the terminal history (if possible). 7348 $term->AddHistory($got) 7349 if length($got) > 1 7350 and defined $term->Features->{addHistory}; 7351 return $got; 7352 } ## end if (@typeahead) 7353 7354 # We really need to read some input. Turn off entry/exit trace and 7355 # return value printing. 7356 local $frame = 0; 7357 local $doret = -2; 7358 7359 # Nothing on the filehandle stack. Socket? 7360 if ( ref $OUT and UNIVERSAL::isa( $OUT, 'IO::Socket::INET' ) ) { 7361 7362 # Send anything we have to send. 7363 $OUT->write( join( '', @_ ) ); 7364 7365 # Receive anything there is to receive. 7366 my $stuff = ''; 7367 my $buf; 7368 my $first_time = 1; 7369 7370 while ($first_time or (length($buf) && ($stuff .= $buf) !~ /\n/)) 7371 { 7372 $first_time = 0; 7373 $IN->recv( $buf = '', 2048 ); # XXX "what's wrong with sysread?" 7374 # XXX Don't know. You tell me. 7375 } 7376 7377 # What we got. 7378 return $stuff; 7379 } ## end if (ref $OUT and UNIVERSAL::isa... 7380 7381 # No socket. Just read from the terminal. 7382 else { 7383 return $term->readline(@_); 7384 } 7385} ## end sub readline 7386 7387=head1 OPTIONS SUPPORT ROUTINES 7388 7389These routines handle listing and setting option values. 7390 7391=head2 C<dump_option> - list the current value of an option setting 7392 7393This routine uses C<option_val> to look up the value for an option. 7394It cleans up escaped single-quotes and then displays the option and 7395its value. 7396 7397=cut 7398 7399sub dump_option { 7400 my ( $opt, $val ) = @_; 7401 $val = option_val( $opt, 'N/A' ); 7402 $val =~ s/([\\\'])/\\$1/g; 7403 printf $OUT "%20s = '%s'\n", $opt, $val; 7404} ## end sub dump_option 7405 7406sub options2remember { 7407 foreach my $k (@RememberOnROptions) { 7408 $option{$k} = option_val( $k, 'N/A' ); 7409 } 7410 return %option; 7411} 7412 7413=head2 C<option_val> - find the current value of an option 7414 7415This can't just be a simple hash lookup because of the indirect way that 7416the option values are stored. Some are retrieved by calling a subroutine, 7417some are just variables. 7418 7419You must supply a default value to be used in case the option isn't set. 7420 7421=cut 7422 7423sub option_val { 7424 my ( $opt, $default ) = @_; 7425 my $val; 7426 7427 # Does this option exist, and is it a variable? 7428 # If so, retrieve the value via the value in %optionVars. 7429 if ( defined $optionVars{$opt} 7430 and defined ${ $optionVars{$opt} } ) 7431 { 7432 $val = ${ $optionVars{$opt} }; 7433 } 7434 7435 # Does this option exist, and it's a subroutine? 7436 # If so, call the subroutine via the ref in %optionAction 7437 # and capture the value. 7438 elsif ( defined $optionAction{$opt} 7439 and defined &{ $optionAction{$opt} } ) 7440 { 7441 $val = &{ $optionAction{$opt} }(); 7442 } 7443 7444 # If there's an action or variable for the supplied option, 7445 # but no value was set, use the default. 7446 elsif (defined $optionAction{$opt} and not defined $option{$opt} 7447 or defined $optionVars{$opt} and not defined ${ $optionVars{$opt} } ) 7448 { 7449 $val = $default; 7450 } 7451 7452 # Otherwise, do the simple hash lookup. 7453 else { 7454 $val = $option{$opt}; 7455 } 7456 7457 # If the value isn't defined, use the default. 7458 # Then return whatever the value is. 7459 $val = $default unless defined $val; 7460 $val; 7461} ## end sub option_val 7462 7463=head2 C<parse_options> 7464 7465Handles the parsing and execution of option setting/displaying commands. 7466 7467An option entered by itself is assumed to be I<set me to 1> (the default value) 7468if the option is a boolean one. If not, the user is prompted to enter a valid 7469value or to query the current value (via C<option? >). 7470 7471If C<option=value> is entered, we try to extract a quoted string from the 7472value (if it is quoted). If it's not, we just use the whole value as-is. 7473 7474We load any modules required to service this option, and then we set it: if 7475it just gets stuck in a variable, we do that; if there's a subroutine to 7476handle setting the option, we call that. 7477 7478Finally, if we're running in interactive mode, we display the effect of the 7479user's command back to the terminal, skipping this if we're setting things 7480during initialization. 7481 7482=cut 7483 7484sub parse_options { 7485 my ($s) = @_; 7486 local $\ = ''; 7487 7488 my $option; 7489 7490 # These options need a value. Don't allow them to be clobbered by accident. 7491 my %opt_needs_val = map { ( $_ => 1 ) } qw{ 7492 dumpDepth arrayDepth hashDepth LineInfo maxTraceLen ornaments windowSize 7493 pager quote ReadLine recallCommand RemotePort ShellBang TTY CommandSet 7494 }; 7495 7496 while (length($s)) { 7497 my $val_defaulted; 7498 7499 # Clean off excess leading whitespace. 7500 $s =~ s/^\s+// && next; 7501 7502 # Options are always all word characters, followed by a non-word 7503 # separator. 7504 if ($s !~ s/^(\w+)(\W?)//) { 7505 print {$OUT} "Invalid option '$s'\n"; 7506 last; 7507 } 7508 my ( $opt, $sep ) = ( $1, $2 ); 7509 7510 # Make sure that such an option exists. 7511 my $matches = ( grep { /^\Q$opt/ && ( $option = $_ ) } @options ) 7512 || ( grep { /^\Q$opt/i && ( $option = $_ ) } @options ); 7513 7514 unless ($matches) { 7515 print {$OUT} "Unknown option '$opt'\n"; 7516 next; 7517 } 7518 if ($matches > 1) { 7519 print {$OUT} "Ambiguous option '$opt'\n"; 7520 next; 7521 } 7522 my $val; 7523 7524 # '?' as separator means query, but must have whitespace after it. 7525 if ( "?" eq $sep ) { 7526 if ($s =~ /\A\S/) { 7527 print {$OUT} "Option query '$opt?' followed by non-space '$s'\n" ; 7528 7529 last; 7530 } 7531 7532 #&dump_option($opt); 7533 } ## end if ("?" eq $sep) 7534 7535 # Separator is whitespace (or just a carriage return). 7536 # They're going for a default, which we assume is 1. 7537 elsif ( $sep !~ /\S/ ) { 7538 $val_defaulted = 1; 7539 $val = "1"; # this is an evil default; make 'em set it! 7540 } 7541 7542 # Separator is =. Trying to set a value. 7543 elsif ( $sep eq "=" ) { 7544 7545 # If quoted, extract a quoted string. 7546 if ($s =~ s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) { 7547 my $quote = $1; 7548 ( $val = $2 ) =~ s/\\([$quote\\])/$1/g; 7549 } 7550 7551 # Not quoted. Use the whole thing. Warn about 'option='. 7552 else { 7553 $s =~ s/^(\S*)//; 7554 $val = $1; 7555 print OUT qq(Option better cleared using $opt=""\n) 7556 unless length $val; 7557 } ## end else [ if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) 7558 7559 } ## end elsif ($sep eq "=") 7560 7561 # "Quoted" with [], <>, or {}. 7562 else { #{ to "let some poor schmuck bounce on the % key in B<vi>." 7563 my ($end) = 7564 "\\" . substr( ")]>}$sep", index( "([<{", $sep ), 1 ); #} 7565 $s =~ s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)// 7566 or print( $OUT "Unclosed option value '$opt$sep$_'\n" ), last; 7567 ( $val = $1 ) =~ s/\\([\\$end])/$1/g; 7568 } ## end else [ if ("?" eq $sep) 7569 7570 # Exclude non-booleans from getting set to 1 by default. 7571 if ( $opt_needs_val{$option} && $val_defaulted ) { 7572 my $cmd = ( $CommandSet eq '580' ) ? 'o' : 'O'; 7573 print {$OUT} 7574"Option '$opt' is non-boolean. Use '$cmd $option=VAL' to set, '$cmd $option?' to query\n"; 7575 next; 7576 } ## end if ($opt_needs_val{$option... 7577 7578 # Save the option value. 7579 $option{$option} = $val if defined $val; 7580 7581 # Load any module that this option requires. 7582 if ( defined($optionRequire{$option}) && defined($val) ) { 7583 eval qq{ 7584 local \$frame = 0; 7585 local \$doret = -2; 7586 require '$optionRequire{$option}'; 7587 1; 7588 } || die $@ # XXX: shouldn't happen 7589 } 7590 7591 # Set it. 7592 # Stick it in the proper variable if it goes in a variable. 7593 if (defined($optionVars{$option}) && defined($val)) { 7594 ${ $optionVars{$option} } = $val; 7595 } 7596 7597 # Call the appropriate sub if it gets set via sub. 7598 if (defined($optionAction{$option}) 7599 && defined (&{ $optionAction{$option} }) 7600 && defined ($val)) 7601 { 7602 &{ $optionAction{$option} }($val); 7603 } 7604 7605 # Not initialization - echo the value we set it to. 7606 dump_option($option) if ($OUT ne \*STDERR); 7607 } ## end while (length) 7608} ## end sub parse_options 7609 7610=head1 RESTART SUPPORT 7611 7612These routines are used to store (and restore) lists of items in environment 7613variables during a restart. 7614 7615=head2 set_list 7616 7617Set_list packages up items to be stored in a set of environment variables 7618(VAR_n, containing the number of items, and VAR_0, VAR_1, etc., containing 7619the values). Values outside the standard ASCII charset are stored by encoding 7620them as hexadecimal values. 7621 7622=cut 7623 7624sub set_list { 7625 my ( $stem, @list ) = @_; 7626 my $val; 7627 7628 # VAR_n: how many we have. Scalar assignment gets the number of items. 7629 $ENV{"${stem}_n"} = @list; 7630 7631 # Grab each item in the list, escape the backslashes, encode the non-ASCII 7632 # as hex, and then save in the appropriate VAR_0, VAR_1, etc. 7633 for my $i ( 0 .. $#list ) { 7634 $val = $list[$i]; 7635 $val =~ s/\\/\\\\/g; 7636 no warnings 'experimental::regex_sets'; 7637 $val =~ s/ ( (?[ [\000-\xFF] & [:^print:] ]) ) / 7638 "\\0x" . unpack('H2',$1)/xaeg; 7639 $ENV{"${stem}_$i"} = $val; 7640 } ## end for $i (0 .. $#list) 7641} ## end sub set_list 7642 7643=head2 get_list 7644 7645Reverse the set_list operation: grab VAR_n to see how many we should be getting 7646back, and then pull VAR_0, VAR_1. etc. back out. 7647 7648=cut 7649 7650sub get_list { 7651 my $stem = shift; 7652 my @list; 7653 my $n = delete $ENV{"${stem}_n"}; 7654 my $val; 7655 for my $i ( 0 .. $n - 1 ) { 7656 $val = delete $ENV{"${stem}_$i"}; 7657 $val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge; 7658 push @list, $val; 7659 } 7660 @list; 7661} ## end sub get_list 7662 7663=head1 MISCELLANEOUS SIGNAL AND I/O MANAGEMENT 7664 7665=head2 catch() 7666 7667The C<catch()> subroutine is the essence of fast and low-impact. We simply 7668set an already-existing global scalar variable to a constant value. This 7669avoids allocating any memory possibly in the middle of something that will 7670get all confused if we do, particularly under I<unsafe signals>. 7671 7672=cut 7673 7674sub catch { 7675 $signal = 1; 7676 return; # Put nothing on the stack - malloc/free land! 7677} 7678 7679=head2 C<warn()> 7680 7681C<warn> emits a warning, by joining together its arguments and printing 7682them, with couple of fillips. 7683 7684If the composited message I<doesn't> end with a newline, we automatically 7685add C<$!> and a newline to the end of the message. The subroutine expects $OUT 7686to be set to the filehandle to be used to output warnings; it makes no 7687assumptions about what filehandles are available. 7688 7689=cut 7690 7691sub _db_warn { 7692 my ($msg) = join( "", @_ ); 7693 $msg .= ": $!\n" unless $msg =~ /\n$/; 7694 local $\ = ''; 7695 print $OUT $msg; 7696} ## end sub warn 7697 7698*warn = \&_db_warn; 7699 7700=head1 INITIALIZATION TTY SUPPORT 7701 7702=head2 C<reset_IN_OUT> 7703 7704This routine handles restoring the debugger's input and output filehandles 7705after we've tried and failed to move them elsewhere. In addition, it assigns 7706the debugger's output filehandle to $LINEINFO if it was already open there. 7707 7708=cut 7709 7710sub reset_IN_OUT { 7711 my $switch_li = $LINEINFO eq $OUT; 7712 7713 # If there's a term and it's able to get a new tty, try to get one. 7714 if ( $term and $term->Features->{newTTY} ) { 7715 ( $IN, $OUT ) = ( shift, shift ); 7716 $term->newTTY( $IN, $OUT ); 7717 } 7718 7719 # This term can't get a new tty now. Better luck later. 7720 elsif ($term) { 7721 _db_warn("Too late to set IN/OUT filehandles, enabled on next 'R'!\n"); 7722 } 7723 7724 # Set the filehndles up as they were. 7725 else { 7726 ( $IN, $OUT ) = ( shift, shift ); 7727 } 7728 7729 # Unbuffer the output filehandle. 7730 _autoflush($OUT); 7731 7732 # Point LINEINFO to the same output filehandle if it was there before. 7733 $LINEINFO = $OUT if $switch_li; 7734} ## end sub reset_IN_OUT 7735 7736=head1 OPTION SUPPORT ROUTINES 7737 7738The following routines are used to process some of the more complicated 7739debugger options. 7740 7741=head2 C<TTY> 7742 7743Sets the input and output filehandles to the specified files or pipes. 7744If the terminal supports switching, we go ahead and do it. If not, and 7745there's already a terminal in place, we save the information to take effect 7746on restart. 7747 7748If there's no terminal yet (for instance, during debugger initialization), 7749we go ahead and set C<$console> and C<$tty> to the file indicated. 7750 7751=cut 7752 7753sub TTY { 7754 7755 if ( @_ and $term and $term->Features->{newTTY} ) { 7756 7757 # This terminal supports switching to a new TTY. 7758 # Can be a list of two files, or on string containing both names, 7759 # comma-separated. 7760 # XXX Should this perhaps be an assignment from @_? 7761 my ( $in, $out ) = shift; 7762 if ( $in =~ /,/ ) { 7763 7764 # Split list apart if supplied. 7765 ( $in, $out ) = split /,/, $in, 2; 7766 } 7767 else { 7768 7769 # Use the same file for both input and output. 7770 $out = $in; 7771 } 7772 7773 # Open file onto the debugger's filehandles, if you can. 7774 open IN, '<', $in or die "cannot open '$in' for read: $!"; 7775 open OUT, '>', $out or die "cannot open '$out' for write: $!"; 7776 7777 # Swap to the new filehandles. 7778 reset_IN_OUT( \*IN, \*OUT ); 7779 7780 # Save the setting for later. 7781 return $tty = $in; 7782 } ## end if (@_ and $term and $term... 7783 7784 # Terminal doesn't support new TTY, or doesn't support readline. 7785 # Can't do it now, try restarting. 7786 if ($term and @_) { 7787 _db_warn("Too late to set TTY, enabled on next 'R'!\n"); 7788 } 7789 7790 # Useful if done through PERLDB_OPTS: 7791 $console = $tty = shift if @_; 7792 7793 # Return whatever the TTY is. 7794 $tty or $console; 7795} ## end sub TTY 7796 7797=head2 C<noTTY> 7798 7799Sets the C<$notty> global, controlling whether or not the debugger tries to 7800get a terminal to read from. If called after a terminal is already in place, 7801we save the value to use it if we're restarted. 7802 7803=cut 7804 7805sub noTTY { 7806 if ($term) { 7807 _db_warn("Too late to set noTTY, enabled on next 'R'!\n") if @_; 7808 } 7809 $notty = shift if @_; 7810 $notty; 7811} ## end sub noTTY 7812 7813=head2 C<ReadLine> 7814 7815Sets the C<$rl> option variable. If 0, we use C<Term::ReadLine::Stub> 7816(essentially, no C<readline> processing on this I<terminal>). Otherwise, we 7817use C<Term::ReadLine>. Can't be changed after a terminal's in place; we save 7818the value in case a restart is done so we can change it then. 7819 7820=cut 7821 7822sub ReadLine { 7823 if ($term) { 7824 _db_warn("Too late to set ReadLine, enabled on next 'R'!\n") if @_; 7825 } 7826 $rl = shift if @_; 7827 $rl; 7828} ## end sub ReadLine 7829 7830=head2 C<RemotePort> 7831 7832Sets the port that the debugger will try to connect to when starting up. 7833If the terminal's already been set up, we can't do it, but we remember the 7834setting in case the user does a restart. 7835 7836=cut 7837 7838sub RemotePort { 7839 if ($term) { 7840 _db_warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_; 7841 } 7842 $remoteport = shift if @_; 7843 $remoteport; 7844} ## end sub RemotePort 7845 7846=head2 C<tkRunning> 7847 7848Checks with the terminal to see if C<Tk> is running, and returns true or 7849false. Returns false if the current terminal doesn't support C<readline>. 7850 7851=cut 7852 7853sub tkRunning { 7854 if ( ${ $term->Features }{tkRunning} ) { 7855 return $term->tkRunning(@_); 7856 } 7857 else { 7858 local $\ = ''; 7859 print $OUT "tkRunning not supported by current ReadLine package.\n"; 7860 0; 7861 } 7862} ## end sub tkRunning 7863 7864=head2 C<NonStop> 7865 7866Sets nonstop mode. If a terminal's already been set up, it's too late; the 7867debugger remembers the setting in case you restart, though. 7868 7869=cut 7870 7871sub NonStop { 7872 if ($term) { 7873 _db_warn("Too late to set up NonStop mode, enabled on next 'R'!\n") 7874 if @_; 7875 } 7876 $runnonstop = shift if @_; 7877 $runnonstop; 7878} ## end sub NonStop 7879 7880sub DollarCaretP { 7881 if ($term) { 7882 _db_warn("Some flag changes could not take effect until next 'R'!\n") 7883 if @_; 7884 } 7885 $^P = parse_DollarCaretP_flags(shift) if @_; 7886 expand_DollarCaretP_flags($^P); 7887} 7888 7889=head2 C<pager> 7890 7891Set up the C<$pager> variable. Adds a pipe to the front unless there's one 7892there already. 7893 7894=cut 7895 7896sub pager { 7897 if (@_) { 7898 $pager = shift; 7899 $pager = "|" . $pager unless $pager =~ /^(\+?\>|\|)/; 7900 } 7901 $pager; 7902} ## end sub pager 7903 7904=head2 C<shellBang> 7905 7906Sets the shell escape command, and generates a printable copy to be used 7907in the help. 7908 7909=cut 7910 7911sub shellBang { 7912 7913 # If we got an argument, meta-quote it, and add '\b' if it 7914 # ends in a word character. 7915 if (@_) { 7916 $sh = quotemeta shift; 7917 $sh .= "\\b" if $sh =~ /\w$/; 7918 } 7919 7920 # Generate the printable version for the help: 7921 $psh = $sh; # copy it 7922 $psh =~ s/\\b$//; # Take off trailing \b if any 7923 $psh =~ s/\\(.)/$1/g; # De-escape 7924 $psh; # return the printable version 7925} ## end sub shellBang 7926 7927=head2 C<ornaments> 7928 7929If the terminal has its own ornaments, fetch them. Otherwise accept whatever 7930was passed as the argument. (This means you can't override the terminal's 7931ornaments.) 7932 7933=cut 7934 7935sub ornaments { 7936 if ( defined $term ) { 7937 7938 # We don't want to show warning backtraces, but we do want die() ones. 7939 local $warnLevel = 0; 7940 local $dieLevel = 1; 7941 7942 # No ornaments if the terminal doesn't support them. 7943 if (not $term->Features->{ornaments}) { 7944 return ''; 7945 } 7946 7947 return (eval { $term->ornaments(@_) } || ''); 7948 } 7949 7950 # Use what was passed in if we can't determine it ourselves. 7951 else { 7952 $ornaments = shift; 7953 7954 return $ornaments; 7955 } 7956 7957} ## end sub ornaments 7958 7959=head2 C<recallCommand> 7960 7961Sets the recall command, and builds a printable version which will appear in 7962the help text. 7963 7964=cut 7965 7966sub recallCommand { 7967 7968 # If there is input, metaquote it. Add '\b' if it ends with a word 7969 # character. 7970 if (@_) { 7971 $rc = quotemeta shift; 7972 $rc .= "\\b" if $rc =~ /\w$/; 7973 } 7974 7975 # Build it into a printable version. 7976 $prc = $rc; # Copy it 7977 $prc =~ s/\\b$//; # Remove trailing \b 7978 $prc =~ s/\\(.)/$1/g; # Remove escapes 7979 return $prc; # Return the printable version 7980} ## end sub recallCommand 7981 7982=head2 C<LineInfo> - where the line number information goes 7983 7984Called with no arguments, returns the file or pipe that line info should go to. 7985 7986Called with an argument (a file or a pipe), it opens that onto the 7987C<LINEINFO> filehandle, unbuffers the filehandle, and then returns the 7988file or pipe again to the caller. 7989 7990=cut 7991 7992sub LineInfo { 7993 if (@_) { 7994 $lineinfo = shift; 7995 7996 # If this is a valid "thing to be opened for output", tack a 7997 # '>' onto the front. 7998 my $stream = ( $lineinfo =~ /^(\+?\>|\|)/ ) ? $lineinfo : ">$lineinfo"; 7999 8000 # If this is a pipe, the stream points to a slave editor. 8001 $slave_editor = ( $stream =~ /^\|/ ); 8002 8003 my $new_lineinfo_fh; 8004 # Open it up and unbuffer it. 8005 open ($new_lineinfo_fh , $stream ) 8006 or _db_warn("Cannot open '$stream' for write"); 8007 $LINEINFO = $new_lineinfo_fh; 8008 _autoflush($LINEINFO); 8009 } 8010 8011 return $lineinfo; 8012} ## end sub LineInfo 8013 8014=head1 COMMAND SUPPORT ROUTINES 8015 8016These subroutines provide functionality for various commands. 8017 8018=head2 C<list_modules> 8019 8020For the C<M> command: list modules loaded and their versions. 8021Essentially just runs through the keys in %INC, picks each package's 8022C<$VERSION> variable, gets the file name, and formats the information 8023for output. 8024 8025=cut 8026 8027sub list_modules { # versions 8028 my %version; 8029 my $file; 8030 8031 # keys are the "as-loaded" name, values are the fully-qualified path 8032 # to the file itself. 8033 for ( keys %INC ) { 8034 $file = $_; # get the module name 8035 s,\.p[lm]$,,i; # remove '.pl' or '.pm' 8036 s,/,::,g; # change '/' to '::' 8037 s/^perl5db$/DB/; # Special case: debugger 8038 # moves to package DB 8039 s/^Term::ReadLine::readline$/readline/; # simplify readline 8040 8041 # If the package has a $VERSION package global (as all good packages 8042 # should!) decode it and save as partial message. 8043 my $pkg_version = do { no strict 'refs'; ${ $_ . '::VERSION' } }; 8044 if ( defined $pkg_version ) { 8045 $version{$file} = "$pkg_version from "; 8046 } 8047 8048 # Finish up the message with the file the package came from. 8049 $version{$file} .= $INC{$file}; 8050 } ## end for (keys %INC) 8051 8052 # Hey, dumpit() formats a hash nicely, so why not use it? 8053 dumpit( $OUT, \%version ); 8054} ## end sub list_modules 8055 8056=head2 C<sethelp()> 8057 8058Sets up the monster string used to format and print the help. 8059 8060=head3 HELP MESSAGE FORMAT 8061 8062The help message is a peculiar format unto itself; it mixes C<pod> I<ornaments> 8063(C<< B<> >> C<< I<> >>) with tabs to come up with a format that's fairly 8064easy to parse and portable, but which still allows the help to be a little 8065nicer than just plain text. 8066 8067Essentially, you define the command name (usually marked up with C<< B<> >> 8068and C<< I<> >>), followed by a tab, and then the descriptive text, ending in a 8069newline. The descriptive text can also be marked up in the same way. If you 8070need to continue the descriptive text to another line, start that line with 8071just tabs and then enter the marked-up text. 8072 8073If you are modifying the help text, I<be careful>. The help-string parser is 8074not very sophisticated, and if you don't follow these rules it will mangle the 8075help beyond hope until you fix the string. 8076 8077=cut 8078 8079use vars qw($pre580_help); 8080use vars qw($pre580_summary); 8081 8082sub sethelp { 8083 8084 # XXX: make sure there are tabs between the command and explanation, 8085 # or print_help will screw up your formatting if you have 8086 # eeevil ornaments enabled. This is an insane mess. 8087 8088 $help = " 8089Help is currently only available for the new 5.8 command set. 8090No help is available for the old command set. 8091We assume you know what you're doing if you switch to it. 8092 8093B<T> Stack trace. 8094B<s> [I<expr>] Single step [in I<expr>]. 8095B<n> [I<expr>] Next, steps over subroutine calls [in I<expr>]. 8096<B<CR>> Repeat last B<n> or B<s> command. 8097B<r> Return from current subroutine. 8098B<c> [I<line>|I<sub>] Continue; optionally inserts a one-time-only breakpoint 8099 at the specified position. 8100B<l> I<min>B<+>I<incr> List I<incr>+1 lines starting at I<min>. 8101B<l> I<min>B<->I<max> List lines I<min> through I<max>. 8102B<l> I<line> List single I<line>. 8103B<l> I<subname> List first window of lines from subroutine. 8104B<l> I<\$var> List first window of lines from subroutine referenced by I<\$var>. 8105B<l> List next window of lines. 8106B<-> List previous window of lines. 8107B<v> [I<line>] View window around I<line>. 8108B<.> Return to the executed line. 8109B<f> I<filename> Switch to viewing I<filename>. File must be already loaded. 8110 I<filename> may be either the full name of the file, or a regular 8111 expression matching the full file name: 8112 B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file. 8113 Evals (with saved bodies) are considered to be filenames: 8114 B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval 8115 (in the order of execution). 8116B</>I<pattern>B</> Search forwards for I<pattern>; final B</> is optional. 8117B<?>I<pattern>B<?> Search backwards for I<pattern>; final B<?> is optional. 8118B<L> [I<a|b|w>] List actions and or breakpoints and or watch-expressions. 8119B<S> [[B<!>]I<pattern>] List subroutine names [not] matching I<pattern>. 8120B<t> [I<n>] Toggle trace mode (to max I<n> levels below current stack depth). 8121B<t> [I<n>] I<expr> Trace through execution of I<expr>. 8122B<b> Sets breakpoint on current line) 8123B<b> [I<line>] [I<condition>] 8124 Set breakpoint; I<line> defaults to the current execution line; 8125 I<condition> breaks if it evaluates to true, defaults to '1'. 8126B<b> I<subname> [I<condition>] 8127 Set breakpoint at first line of subroutine. 8128B<b> I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>. 8129B<b> B<load> I<filename> Set breakpoint on 'require'ing the given file. 8130B<b> B<postpone> I<subname> [I<condition>] 8131 Set breakpoint at first line of subroutine after 8132 it is compiled. 8133B<b> B<compile> I<subname> 8134 Stop after the subroutine is compiled. 8135B<B> [I<line>] Delete the breakpoint for I<line>. 8136B<B> I<*> Delete all breakpoints. 8137B<a> [I<line>] I<command> 8138 Set an action to be done before the I<line> is executed; 8139 I<line> defaults to the current execution line. 8140 Sequence is: check for breakpoint/watchpoint, print line 8141 if necessary, do action, prompt user if necessary, 8142 execute line. 8143B<a> Does nothing 8144B<A> [I<line>] Delete the action for I<line>. 8145B<A> I<*> Delete all actions. 8146B<w> I<expr> Add a global watch-expression. 8147B<w> Does nothing 8148B<W> I<expr> Delete a global watch-expression. 8149B<W> I<*> Delete all watch-expressions. 8150B<V> [I<pkg> [I<vars>]] List some (default all) variables in package (default current). 8151 Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps. 8152B<X> [I<vars>] Same as \"B<V> I<currentpackage> [I<vars>]\". 8153B<x> I<expr> Evals expression in list context, dumps the result. 8154B<m> I<expr> Evals expression in list context, prints methods callable 8155 on the first element of the result. 8156B<m> I<class> Prints methods callable via the given class. 8157B<M> Show versions of loaded modules. 8158B<i> I<class> Prints nested parents of given class. 8159B<e> Display current thread id. 8160B<E> Display all thread ids the current one will be identified: <n>. 8161B<y> [I<n> [I<Vars>]] List lexicals in higher scope <n>. Vars same as B<V>. 8162 8163B<<> ? List Perl commands to run before each prompt. 8164B<<> I<expr> Define Perl command to run before each prompt. 8165B<<<> I<expr> Add to the list of Perl commands to run before each prompt. 8166B<< *> Delete the list of perl commands to run before each prompt. 8167B<>> ? List Perl commands to run after each prompt. 8168B<>> I<expr> Define Perl command to run after each prompt. 8169B<>>B<>> I<expr> Add to the list of Perl commands to run after each prompt. 8170B<>>B< *> Delete the list of Perl commands to run after each prompt. 8171B<{> I<db_command> Define debugger command to run before each prompt. 8172B<{> ? List debugger commands to run before each prompt. 8173B<{{> I<db_command> Add to the list of debugger commands to run before each prompt. 8174B<{ *> Delete the list of debugger commands to run before each prompt. 8175B<$prc> I<number> Redo a previous command (default previous command). 8176B<$prc> I<-number> Redo number'th-to-last command. 8177B<$prc> I<pattern> Redo last command that started with I<pattern>. 8178 See 'B<O> I<recallCommand>' too. 8179B<$psh$psh> I<cmd> Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)" 8180 . ( 8181 $rc eq $sh 8182 ? "" 8183 : " 8184B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")." 8185 ) . " 8186 See 'B<O> I<shellBang>' too. 8187B<source> I<file> Execute I<file> containing debugger commands (may nest). 8188B<save> I<file> Save current debugger session (actual history) to I<file>. 8189B<rerun> Rerun session to current position. 8190B<rerun> I<n> Rerun session to numbered command. 8191B<rerun> I<-n> Rerun session to number'th-to-last command. 8192B<H> I<-number> Display last number commands (default all). 8193B<H> I<*> Delete complete history. 8194B<p> I<expr> Same as \"I<print {DB::OUT} expr>\" in current package. 8195B<|>I<dbcmd> Run debugger command, piping DB::OUT to current pager. 8196B<||>I<dbcmd> Same as B<|>I<dbcmd> but DB::OUT is temporarily select()ed as well. 8197B<\=> [I<alias> I<value>] Define a command alias, or list current aliases. 8198I<command> Execute as a perl statement in current package. 8199B<R> Pure-man-restart of debugger, some of debugger state 8200 and command-line options may be lost. 8201 Currently the following settings are preserved: 8202 history, breakpoints and actions, debugger B<O>ptions 8203 and the following command-line options: I<-w>, I<-I>, I<-e>. 8204 8205B<o> [I<opt>] ... Set boolean option to true 8206B<o> [I<opt>B<?>] Query options 8207B<o> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ... 8208 Set options. Use quotes if spaces in value. 8209 I<recallCommand>, I<ShellBang> chars used to recall command or spawn shell; 8210 I<pager> program for output of \"|cmd\"; 8211 I<tkRunning> run Tk while prompting (with ReadLine); 8212 I<signalLevel> I<warnLevel> I<dieLevel> level of verbosity; 8213 I<inhibit_exit> Allows stepping off the end of the script. 8214 I<ImmediateStop> Debugger should stop as early as possible. 8215 I<RemotePort> Remote hostname:port for remote debugging 8216 The following options affect what happens with B<V>, B<X>, and B<x> commands: 8217 I<arrayDepth>, I<hashDepth> print only first N elements ('' for all); 8218 I<compactDump>, I<veryCompact> change style of array and hash dump; 8219 I<globPrint> whether to print contents of globs; 8220 I<DumpDBFiles> dump arrays holding debugged files; 8221 I<DumpPackages> dump symbol tables of packages; 8222 I<DumpReused> dump contents of \"reused\" addresses; 8223 I<quote>, I<HighBit>, I<undefPrint> change style of string dump; 8224 I<bareStringify> Do not print the overload-stringified value; 8225 Other options include: 8226 I<PrintRet> affects printing of return value after B<r> command, 8227 I<frame> affects printing messages on subroutine entry/exit. 8228 I<AutoTrace> affects printing messages on possible breaking points. 8229 I<maxTraceLen> gives max length of evals/args listed in stack trace. 8230 I<ornaments> affects screen appearance of the command line. 8231 I<CreateTTY> bits control attempts to create a new TTY on events: 8232 1: on fork() 2: debugger is started inside debugger 8233 4: on startup 8234 During startup options are initialized from \$ENV{PERLDB_OPTS}. 8235 You can put additional initialization options I<TTY>, I<noTTY>, 8236 I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use 8237 B<R> after you set them). 8238 8239B<q> or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction. 8240B<h> Summary of debugger commands. 8241B<h> [I<db_command>] Get help [on a specific debugger command], enter B<|h> to page. 8242B<h h> Long help for debugger commands 8243B<$doccmd> I<manpage> Runs the external doc viewer B<$doccmd> command on the 8244 named Perl I<manpage>, or on B<$doccmd> itself if omitted. 8245 Set B<\$DB::doccmd> to change viewer. 8246 8247Type '|h h' for a paged display if this was too hard to read. 8248 8249"; # Fix balance of vi % matching: }}}} 8250 8251 # note: tabs in the following section are not-so-helpful 8252 $summary = <<"END_SUM"; 8253I<List/search source lines:> I<Control script execution:> 8254 B<l> [I<ln>|I<sub>] List source code B<T> Stack trace 8255 B<-> or B<.> List previous/current line B<s> [I<expr>] Single step [in expr] 8256 B<v> [I<line>] View around line B<n> [I<expr>] Next, steps over subs 8257 B<f> I<filename> View source in file <B<CR>/B<Enter>> Repeat last B<n> or B<s> 8258 B</>I<pattern>B</> B<?>I<patt>B<?> Search forw/backw B<r> Return from subroutine 8259 B<M> Show module versions B<c> [I<ln>|I<sub>] Continue until position 8260I<Debugger controls:> B<L> List break/watch/actions 8261 B<o> [...] Set debugger options B<t> [I<n>] [I<expr>] Toggle trace [max depth] ][trace expr] 8262 B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint 8263 B<$prc> [I<N>|I<pat>] Redo a previous command B<B> I<ln|*> Delete a/all breakpoints 8264 B<H> [I<-num>] Display last num commands B<a> [I<ln>] I<cmd> Do cmd before line 8265 B<=> [I<a> I<val>] Define/list an alias B<A> I<ln|*> Delete a/all actions 8266 B<h> [I<db_cmd>] Get help on command B<w> I<expr> Add a watch expression 8267 B<h h> Complete help page B<W> I<expr|*> Delete a/all watch exprs 8268 B<|>[B<|>]I<db_cmd> Send output to pager B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess 8269 B<q> or B<^D> Quit B<R> Attempt a restart 8270I<Data Examination:> B<expr> Execute perl code, also see: B<s>,B<n>,B<t> I<expr> 8271 B<x>|B<m> I<expr> Evals expr in list context, dumps the result or lists methods. 8272 B<p> I<expr> Print expression (uses script's current package). 8273 B<S> [[B<!>]I<pat>] List subroutine names [not] matching pattern 8274 B<V> [I<Pk> [I<Vars>]] List Variables in Package. Vars can be ~pattern or !pattern. 8275 B<X> [I<Vars>] Same as \"B<V> I<current_package> [I<Vars>]\". B<i> I<class> inheritance tree. 8276 B<y> [I<n> [I<Vars>]] List lexicals in higher scope <n>. Vars same as B<V>. 8277 B<e> Display thread id B<E> Display all thread ids. 8278For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs. 8279END_SUM 8280 8281 # ')}}; # Fix balance of vi % matching 8282 8283 # and this is really numb... 8284 $pre580_help = " 8285B<T> Stack trace. 8286B<s> [I<expr>] Single step [in I<expr>]. 8287B<n> [I<expr>] Next, steps over subroutine calls [in I<expr>]. 8288B<CR>> Repeat last B<n> or B<s> command. 8289B<r> Return from current subroutine. 8290B<c> [I<line>|I<sub>] Continue; optionally inserts a one-time-only breakpoint 8291 at the specified position. 8292B<l> I<min>B<+>I<incr> List I<incr>+1 lines starting at I<min>. 8293B<l> I<min>B<->I<max> List lines I<min> through I<max>. 8294B<l> I<line> List single I<line>. 8295B<l> I<subname> List first window of lines from subroutine. 8296B<l> I<\$var> List first window of lines from subroutine referenced by I<\$var>. 8297B<l> List next window of lines. 8298B<-> List previous window of lines. 8299B<w> [I<line>] List window around I<line>. 8300B<.> Return to the executed line. 8301B<f> I<filename> Switch to viewing I<filename>. File must be already loaded. 8302 I<filename> may be either the full name of the file, or a regular 8303 expression matching the full file name: 8304 B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file. 8305 Evals (with saved bodies) are considered to be filenames: 8306 B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval 8307 (in the order of execution). 8308B</>I<pattern>B</> Search forwards for I<pattern>; final B</> is optional. 8309B<?>I<pattern>B<?> Search backwards for I<pattern>; final B<?> is optional. 8310B<L> List all breakpoints and actions. 8311B<S> [[B<!>]I<pattern>] List subroutine names [not] matching I<pattern>. 8312B<t> [I<n>] Toggle trace mode (to max I<n> levels below current stack depth) . 8313B<t> [I<n>] I<expr> Trace through execution of I<expr>. 8314B<b> [I<line>] [I<condition>] 8315 Set breakpoint; I<line> defaults to the current execution line; 8316 I<condition> breaks if it evaluates to true, defaults to '1'. 8317B<b> I<subname> [I<condition>] 8318 Set breakpoint at first line of subroutine. 8319B<b> I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>. 8320B<b> B<load> I<filename> Set breakpoint on 'require'ing the given file. 8321B<b> B<postpone> I<subname> [I<condition>] 8322 Set breakpoint at first line of subroutine after 8323 it is compiled. 8324B<b> B<compile> I<subname> 8325 Stop after the subroutine is compiled. 8326B<d> [I<line>] Delete the breakpoint for I<line>. 8327B<D> Delete all breakpoints. 8328B<a> [I<line>] I<command> 8329 Set an action to be done before the I<line> is executed; 8330 I<line> defaults to the current execution line. 8331 Sequence is: check for breakpoint/watchpoint, print line 8332 if necessary, do action, prompt user if necessary, 8333 execute line. 8334B<a> [I<line>] Delete the action for I<line>. 8335B<A> Delete all actions. 8336B<W> I<expr> Add a global watch-expression. 8337B<W> Delete all watch-expressions. 8338B<V> [I<pkg> [I<vars>]] List some (default all) variables in package (default current). 8339 Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps. 8340B<X> [I<vars>] Same as \"B<V> I<currentpackage> [I<vars>]\". 8341B<x> I<expr> Evals expression in list context, dumps the result. 8342B<m> I<expr> Evals expression in list context, prints methods callable 8343 on the first element of the result. 8344B<m> I<class> Prints methods callable via the given class. 8345 8346B<<> ? List Perl commands to run before each prompt. 8347B<<> I<expr> Define Perl command to run before each prompt. 8348B<<<> I<expr> Add to the list of Perl commands to run before each prompt. 8349B<>> ? List Perl commands to run after each prompt. 8350B<>> I<expr> Define Perl command to run after each prompt. 8351B<>>B<>> I<expr> Add to the list of Perl commands to run after each prompt. 8352B<{> I<db_command> Define debugger command to run before each prompt. 8353B<{> ? List debugger commands to run before each prompt. 8354B<{{> I<db_command> Add to the list of debugger commands to run before each prompt. 8355B<$prc> I<number> Redo a previous command (default previous command). 8356B<$prc> I<-number> Redo number'th-to-last command. 8357B<$prc> I<pattern> Redo last command that started with I<pattern>. 8358 See 'B<O> I<recallCommand>' too. 8359B<$psh$psh> I<cmd> Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)" 8360 . ( 8361 $rc eq $sh 8362 ? "" 8363 : " 8364B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")." 8365 ) . " 8366 See 'B<O> I<shellBang>' too. 8367B<source> I<file> Execute I<file> containing debugger commands (may nest). 8368B<H> I<-number> Display last number commands (default all). 8369B<p> I<expr> Same as \"I<print {DB::OUT} expr>\" in current package. 8370B<|>I<dbcmd> Run debugger command, piping DB::OUT to current pager. 8371B<||>I<dbcmd> Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well. 8372B<\=> [I<alias> I<value>] Define a command alias, or list current aliases. 8373I<command> Execute as a perl statement in current package. 8374B<v> Show versions of loaded modules. 8375B<R> Pure-man-restart of debugger, some of debugger state 8376 and command-line options may be lost. 8377 Currently the following settings are preserved: 8378 history, breakpoints and actions, debugger B<O>ptions 8379 and the following command-line options: I<-w>, I<-I>, I<-e>. 8380 8381B<O> [I<opt>] ... Set boolean option to true 8382B<O> [I<opt>B<?>] Query options 8383B<O> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ... 8384 Set options. Use quotes if spaces in value. 8385 I<recallCommand>, I<ShellBang> chars used to recall command or spawn shell; 8386 I<pager> program for output of \"|cmd\"; 8387 I<tkRunning> run Tk while prompting (with ReadLine); 8388 I<signalLevel> I<warnLevel> I<dieLevel> level of verbosity; 8389 I<inhibit_exit> Allows stepping off the end of the script. 8390 I<ImmediateStop> Debugger should stop as early as possible. 8391 I<RemotePort> Remote hostname:port for remote debugging 8392 The following options affect what happens with B<V>, B<X>, and B<x> commands: 8393 I<arrayDepth>, I<hashDepth> print only first N elements ('' for all); 8394 I<compactDump>, I<veryCompact> change style of array and hash dump; 8395 I<globPrint> whether to print contents of globs; 8396 I<DumpDBFiles> dump arrays holding debugged files; 8397 I<DumpPackages> dump symbol tables of packages; 8398 I<DumpReused> dump contents of \"reused\" addresses; 8399 I<quote>, I<HighBit>, I<undefPrint> change style of string dump; 8400 I<bareStringify> Do not print the overload-stringified value; 8401 Other options include: 8402 I<PrintRet> affects printing of return value after B<r> command, 8403 I<frame> affects printing messages on subroutine entry/exit. 8404 I<AutoTrace> affects printing messages on possible breaking points. 8405 I<maxTraceLen> gives max length of evals/args listed in stack trace. 8406 I<ornaments> affects screen appearance of the command line. 8407 I<CreateTTY> bits control attempts to create a new TTY on events: 8408 1: on fork() 2: debugger is started inside debugger 8409 4: on startup 8410 During startup options are initialized from \$ENV{PERLDB_OPTS}. 8411 You can put additional initialization options I<TTY>, I<noTTY>, 8412 I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use 8413 B<R> after you set them). 8414 8415B<q> or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction. 8416B<h> [I<db_command>] Get help [on a specific debugger command], enter B<|h> to page. 8417B<h h> Summary of debugger commands. 8418B<$doccmd> I<manpage> Runs the external doc viewer B<$doccmd> command on the 8419 named Perl I<manpage>, or on B<$doccmd> itself if omitted. 8420 Set B<\$DB::doccmd> to change viewer. 8421 8422Type '|h' for a paged display if this was too hard to read. 8423 8424"; # Fix balance of vi % matching: }}}} 8425 8426 # note: tabs in the following section are not-so-helpful 8427 $pre580_summary = <<"END_SUM"; 8428I<List/search source lines:> I<Control script execution:> 8429 B<l> [I<ln>|I<sub>] List source code B<T> Stack trace 8430 B<-> or B<.> List previous/current line B<s> [I<expr>] Single step [in expr] 8431 B<w> [I<line>] List around line B<n> [I<expr>] Next, steps over subs 8432 B<f> I<filename> View source in file <B<CR>/B<Enter>> Repeat last B<n> or B<s> 8433 B</>I<pattern>B</> B<?>I<patt>B<?> Search forw/backw B<r> Return from subroutine 8434 B<v> Show versions of modules B<c> [I<ln>|I<sub>] Continue until position 8435I<Debugger controls:> B<L> List break/watch/actions 8436 B<O> [...] Set debugger options B<t> [I<expr>] Toggle trace [trace expr] 8437 B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint 8438 B<$prc> [I<N>|I<pat>] Redo a previous command B<d> [I<ln>] or B<D> Delete a/all breakpoints 8439 B<H> [I<-num>] Display last num commands B<a> [I<ln>] I<cmd> Do cmd before line 8440 B<=> [I<a> I<val>] Define/list an alias B<W> I<expr> Add a watch expression 8441 B<h> [I<db_cmd>] Get help on command B<A> or B<W> Delete all actions/watch 8442 B<|>[B<|>]I<db_cmd> Send output to pager B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess 8443 B<q> or B<^D> Quit B<R> Attempt a restart 8444I<Data Examination:> B<expr> Execute perl code, also see: B<s>,B<n>,B<t> I<expr> 8445 B<x>|B<m> I<expr> Evals expr in list context, dumps the result or lists methods. 8446 B<p> I<expr> Print expression (uses script's current package). 8447 B<S> [[B<!>]I<pat>] List subroutine names [not] matching pattern 8448 B<V> [I<Pk> [I<Vars>]] List Variables in Package. Vars can be ~pattern or !pattern. 8449 B<X> [I<Vars>] Same as \"B<V> I<current_package> [I<Vars>]\". 8450 B<y> [I<n> [I<Vars>]] List lexicals in higher scope <n>. Vars same as B<V>. 8451For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs. 8452END_SUM 8453 8454 # ')}}; # Fix balance of vi % matching 8455 8456} ## end sub sethelp 8457 8458=head2 C<print_help()> 8459 8460Most of what C<print_help> does is just text formatting. It finds the 8461C<B> and C<I> ornaments, cleans them off, and substitutes the proper 8462terminal control characters to simulate them (courtesy of 8463C<Term::ReadLine::TermCap>). 8464 8465=cut 8466 8467sub print_help { 8468 my $help_str = shift; 8469 8470 # Restore proper alignment destroyed by eeevil I<> and B<> 8471 # ornaments: A pox on both their houses! 8472 # 8473 # A help command will have everything up to and including 8474 # the first tab sequence padded into a field 16 (or if indented 20) 8475 # wide. If it's wider than that, an extra space will be added. 8476 $help_str =~ s{ 8477 ^ # only matters at start of line 8478 ( \ {4} | \t )* # some subcommands are indented 8479 ( < ? # so <CR> works 8480 [BI] < [^\t\n] + ) # find an eeevil ornament 8481 ( \t+ ) # original separation, discarded 8482 ( .* ) # this will now start (no earlier) than 8483 # column 16 8484 } { 8485 my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4); 8486 my $clean = $command; 8487 $clean =~ s/[BI]<([^>]*)>/$1/g; 8488 8489 # replace with this whole string: 8490 ($leadwhite ? " " x 4 : "") 8491 . $command 8492 . ((" " x (16 + ($leadwhite ? 4 : 0) - length($clean))) || " ") 8493 . $text; 8494 8495 }mgex; 8496 8497 $help_str =~ s{ # handle bold ornaments 8498 B < ( [^>] + | > ) > 8499 } { 8500 $Term::ReadLine::TermCap::rl_term_set[2] 8501 . $1 8502 . $Term::ReadLine::TermCap::rl_term_set[3] 8503 }gex; 8504 8505 $help_str =~ s{ # handle italic ornaments 8506 I < ( [^>] + | > ) > 8507 } { 8508 $Term::ReadLine::TermCap::rl_term_set[0] 8509 . $1 8510 . $Term::ReadLine::TermCap::rl_term_set[1] 8511 }gex; 8512 8513 local $\ = ''; 8514 print {$OUT} $help_str; 8515 8516 return; 8517} ## end sub print_help 8518 8519=head2 C<fix_less> 8520 8521This routine does a lot of gyrations to be sure that the pager is C<less>. 8522It checks for C<less> masquerading as C<more> and records the result in 8523C<$fixed_less> so we don't have to go through doing the stats again. 8524 8525=cut 8526 8527use vars qw($fixed_less); 8528 8529sub _calc_is_less { 8530 if ($pager =~ /\bless\b/) 8531 { 8532 return 1; 8533 } 8534 elsif ($pager =~ /\bmore\b/) 8535 { 8536 # Nope, set to more. See what's out there. 8537 my @st_more = stat('/usr/bin/more'); 8538 my @st_less = stat('/usr/bin/less'); 8539 8540 # is it really less, pretending to be more? 8541 return ( 8542 @st_more 8543 && @st_less 8544 && $st_more[0] == $st_less[0] 8545 && $st_more[1] == $st_less[1] 8546 ); 8547 } 8548 else { 8549 return; 8550 } 8551} 8552 8553sub fix_less { 8554 8555 # We already know if this is set. 8556 return if $fixed_less; 8557 8558 # changes environment! 8559 # 'r' added so we don't do (slow) stats again. 8560 $fixed_less = 1 if _calc_is_less(); 8561 8562 return; 8563} ## end sub fix_less 8564 8565=head1 DIE AND WARN MANAGEMENT 8566 8567=head2 C<diesignal> 8568 8569C<diesignal> is a just-drop-dead C<die> handler. It's most useful when trying 8570to debug a debugger problem. 8571 8572It does its best to report the error that occurred, and then forces the 8573program, debugger, and everything to die. 8574 8575=cut 8576 8577sub diesignal { 8578 8579 # No entry/exit messages. 8580 local $frame = 0; 8581 8582 # No return value prints. 8583 local $doret = -2; 8584 8585 # set the abort signal handling to the default (just terminate). 8586 $SIG{'ABRT'} = 'DEFAULT'; 8587 8588 # If we enter the signal handler recursively, kill myself with an 8589 # abort signal (so we just terminate). 8590 kill 'ABRT', $$ if $panic++; 8591 8592 # If we can show detailed info, do so. 8593 if ( defined &Carp::longmess ) { 8594 8595 # Don't recursively enter the warn handler, since we're carping. 8596 local $SIG{__WARN__} = ''; 8597 8598 # Skip two levels before reporting traceback: we're skipping 8599 # mydie and confess. 8600 local $Carp::CarpLevel = 2; # mydie + confess 8601 8602 # Tell us all about it. 8603 _db_warn( Carp::longmess("Signal @_") ); 8604 } 8605 8606 # No Carp. Tell us about the signal as best we can. 8607 else { 8608 local $\ = ''; 8609 print $DB::OUT "Got signal @_\n"; 8610 } 8611 8612 # Drop dead. 8613 kill 'ABRT', $$; 8614} ## end sub diesignal 8615 8616=head2 C<dbwarn> 8617 8618The debugger's own default C<$SIG{__WARN__}> handler. We load C<Carp> to 8619be able to get a stack trace, and output the warning message vi C<DB::dbwarn()>. 8620 8621=cut 8622 8623sub dbwarn { 8624 8625 # No entry/exit trace. 8626 local $frame = 0; 8627 8628 # No return value printing. 8629 local $doret = -2; 8630 8631 # Turn off warn and die handling to prevent recursive entries to this 8632 # routine. 8633 local $SIG{__WARN__} = ''; 8634 local $SIG{__DIE__} = ''; 8635 8636 # Load Carp if we can. If $^S is false (current thing being compiled isn't 8637 # done yet), we may not be able to do a require. 8638 eval { require Carp } 8639 if defined $^S; # If error/warning during compilation, 8640 # require may be broken. 8641 8642 # Use the core warn() unless Carp loaded OK. 8643 CORE::warn( @_, 8644 "\nCannot print stack trace, load with -MCarp option to see stack" ), 8645 return 8646 unless defined &Carp::longmess; 8647 8648 # Save the current values of $single and $trace, and then turn them off. 8649 my ( $mysingle, $mytrace ) = ( $single, $trace ); 8650 $single = 0; 8651 $trace = 0; 8652 8653 # We can call Carp::longmess without its being "debugged" (which we 8654 # don't want - we just want to use it!). Capture this for later. 8655 my $mess = Carp::longmess(@_); 8656 8657 # Restore $single and $trace to their original values. 8658 ( $single, $trace ) = ( $mysingle, $mytrace ); 8659 8660 # Use the debugger's own special way of printing warnings to print 8661 # the stack trace message. 8662 _db_warn($mess); 8663} ## end sub dbwarn 8664 8665=head2 C<dbdie> 8666 8667The debugger's own C<$SIG{__DIE__}> handler. Handles providing a stack trace 8668by loading C<Carp> and calling C<Carp::longmess()> to get it. We turn off 8669single stepping and tracing during the call to C<Carp::longmess> to avoid 8670debugging it - we just want to use it. 8671 8672If C<dieLevel> is zero, we let the program being debugged handle the 8673exceptions. If it's 1, you get backtraces for any exception. If it's 2, 8674the debugger takes over all exception handling, printing a backtrace and 8675displaying the exception via its C<dbwarn()> routine. 8676 8677=cut 8678 8679sub dbdie { 8680 local $frame = 0; 8681 local $doret = -2; 8682 local $SIG{__DIE__} = ''; 8683 local $SIG{__WARN__} = ''; 8684 if ( $dieLevel > 2 ) { 8685 local $SIG{__WARN__} = \&dbwarn; 8686 _db_warn(@_); # Yell no matter what 8687 return; 8688 } 8689 if ( $dieLevel < 2 ) { 8690 die @_ if $^S; # in eval propagate 8691 } 8692 8693 # The code used to check $^S to see if compilation of the current thing 8694 # hadn't finished. We don't do it anymore, figuring eval is pretty stable. 8695 eval { require Carp }; 8696 8697 die( @_, 8698 "\nCannot print stack trace, load with -MCarp option to see stack" ) 8699 unless defined &Carp::longmess; 8700 8701 # We do not want to debug this chunk (automatic disabling works 8702 # inside DB::DB, but not in Carp). Save $single and $trace, turn them off, 8703 # get the stack trace from Carp::longmess (if possible), restore $signal 8704 # and $trace, and then die with the stack trace. 8705 my ( $mysingle, $mytrace ) = ( $single, $trace ); 8706 $single = 0; 8707 $trace = 0; 8708 my $mess = "@_"; 8709 { 8710 8711 package Carp; # Do not include us in the list 8712 eval { $mess = Carp::longmess(@_); }; 8713 } 8714 ( $single, $trace ) = ( $mysingle, $mytrace ); 8715 die $mess; 8716} ## end sub dbdie 8717 8718=head2 C<warnlevel()> 8719 8720Set the C<$DB::warnLevel> variable that stores the value of the 8721C<warnLevel> option. Calling C<warnLevel()> with a positive value 8722results in the debugger taking over all warning handlers. Setting 8723C<warnLevel> to zero leaves any warning handlers set up by the program 8724being debugged in place. 8725 8726=cut 8727 8728sub warnLevel { 8729 if (@_) { 8730 my $prevwarn = $SIG{__WARN__} unless $warnLevel; 8731 $warnLevel = shift; 8732 if ($warnLevel) { 8733 $SIG{__WARN__} = \&DB::dbwarn; 8734 } 8735 elsif ($prevwarn) { 8736 $SIG{__WARN__} = $prevwarn; 8737 } else { 8738 undef $SIG{__WARN__}; 8739 } 8740 } ## end if (@_) 8741 $warnLevel; 8742} ## end sub warnLevel 8743 8744=head2 C<dielevel> 8745 8746Similar to C<warnLevel>. Non-zero values for C<dieLevel> result in the 8747C<DB::dbdie()> function overriding any other C<die()> handler. Setting it to 8748zero lets you use your own C<die()> handler. 8749 8750=cut 8751 8752sub dieLevel { 8753 local $\ = ''; 8754 if (@_) { 8755 my $prevdie = $SIG{__DIE__} unless $dieLevel; 8756 $dieLevel = shift; 8757 if ($dieLevel) { 8758 8759 # Always set it to dbdie() for non-zero values. 8760 $SIG{__DIE__} = \&DB::dbdie; # if $dieLevel < 2; 8761 8762 # No longer exists, so don't try to use it. 8763 #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2; 8764 8765 # If we've finished initialization, mention that stack dumps 8766 # are enabled, If dieLevel is 1, we won't stack dump if we die 8767 # in an eval(). 8768 print $OUT "Stack dump during die enabled", 8769 ( $dieLevel == 1 ? " outside of evals" : "" ), ".\n" 8770 if $I_m_init; 8771 8772 # XXX This is probably obsolete, given that diehard() is gone. 8773 print $OUT "Dump printed too.\n" if $dieLevel > 2; 8774 } ## end if ($dieLevel) 8775 8776 # Put the old one back if there was one. 8777 elsif ($prevdie) { 8778 $SIG{__DIE__} = $prevdie; 8779 print $OUT "Default die handler restored.\n"; 8780 } else { 8781 undef $SIG{__DIE__}; 8782 print $OUT "Die handler removed.\n"; 8783 } 8784 } ## end if (@_) 8785 $dieLevel; 8786} ## end sub dieLevel 8787 8788=head2 C<signalLevel> 8789 8790Number three in a series: set C<signalLevel> to zero to keep your own 8791signal handler for C<SIGSEGV> and/or C<SIGBUS>. Otherwise, the debugger 8792takes over and handles them with C<DB::diesignal()>. 8793 8794=cut 8795 8796sub signalLevel { 8797 if (@_) { 8798 my $prevsegv = $SIG{SEGV} unless $signalLevel; 8799 my $prevbus = $SIG{BUS} unless $signalLevel; 8800 $signalLevel = shift; 8801 if ($signalLevel) { 8802 $SIG{SEGV} = \&DB::diesignal; 8803 $SIG{BUS} = \&DB::diesignal; 8804 } 8805 else { 8806 $SIG{SEGV} = $prevsegv; 8807 $SIG{BUS} = $prevbus; 8808 } 8809 } ## end if (@_) 8810 $signalLevel; 8811} ## end sub signalLevel 8812 8813=head1 SUBROUTINE DECODING SUPPORT 8814 8815These subroutines are used during the C<x> and C<X> commands to try to 8816produce as much information as possible about a code reference. They use 8817L<Devel::Peek> to try to find the glob in which this code reference lives 8818(if it does) - this allows us to actually code references which correspond 8819to named subroutines (including those aliased via glob assignment). 8820 8821=head2 C<CvGV_name()> 8822 8823Wrapper for C<CvGV_name_or_bust>; tries to get the name of a reference 8824via that routine. If this fails, return the reference again (when the 8825reference is stringified, it'll come out as C<SOMETHING(0x...)>). 8826 8827=cut 8828 8829sub CvGV_name { 8830 my $in = shift; 8831 my $name = CvGV_name_or_bust($in); 8832 defined $name ? $name : $in; 8833} 8834 8835=head2 C<CvGV_name_or_bust> I<coderef> 8836 8837Calls L<Devel::Peek> to try to find the glob the ref lives in; returns 8838C<undef> if L<Devel::Peek> can't be loaded, or if C<Devel::Peek::CvGV> can't 8839find a glob for this ref. 8840 8841Returns C<< I<package>::I<glob name> >> if the code ref is found in a glob. 8842 8843=cut 8844 8845use vars qw($skipCvGV); 8846 8847sub CvGV_name_or_bust { 8848 my $in = shift; 8849 return if $skipCvGV; # Backdoor to avoid problems if XS broken... 8850 return unless ref $in; 8851 $in = \&$in; # Hard reference... 8852 eval { _DB__use__full_path(sub { require Devel::Peek; 1;}); } or return; 8853 my $gv = Devel::Peek::CvGV($in) or return; 8854 *$gv{PACKAGE} . '::' . *$gv{NAME}; 8855} ## end sub CvGV_name_or_bust 8856 8857=head2 C<find_sub> 8858 8859A utility routine used in various places; finds the file where a subroutine 8860was defined, and returns that filename and a line-number range. 8861 8862Tries to use C<@sub> first; if it can't find it there, it tries building a 8863reference to the subroutine and uses C<CvGV_name_or_bust> to locate it, 8864loading it into C<@sub> as a side effect (XXX I think). If it can't find it 8865this way, it brute-force searches C<%sub>, checking for identical references. 8866 8867=cut 8868 8869sub _find_sub_helper { 8870 my $subr = shift; 8871 8872 return unless defined &$subr; 8873 my $name = CvGV_name_or_bust($subr); 8874 my $data; 8875 $data = $sub{$name} if defined $name; 8876 return $data if defined $data; 8877 8878 # Old stupid way... 8879 $subr = \&$subr; # Hard reference 8880 my $s; 8881 for ( keys %sub ) { 8882 $s = $_, last if $subr eq \&$_; 8883 } 8884 if ($s) 8885 { 8886 return $sub{$s}; 8887 } 8888 else 8889 { 8890 return; 8891 } 8892 8893} 8894 8895sub find_sub { 8896 my $subr = shift; 8897 return ( $sub{$subr} || _find_sub_helper($subr) ); 8898} ## end sub find_sub 8899 8900=head2 C<methods> 8901 8902A subroutine that uses the utility function C<methods_via> to find all the 8903methods in the class corresponding to the current reference and in 8904C<UNIVERSAL>. 8905 8906=cut 8907 8908use vars qw(%seen); 8909 8910sub methods { 8911 8912 # Figure out the class - either this is the class or it's a reference 8913 # to something blessed into that class. 8914 my $class = shift; 8915 $class = ref $class if ref $class; 8916 8917 local %seen; 8918 8919 # Show the methods that this class has. 8920 methods_via( $class, '', 1 ); 8921 8922 # Show the methods that UNIVERSAL has. 8923 methods_via( 'UNIVERSAL', 'UNIVERSAL', 0 ); 8924} ## end sub methods 8925 8926=head2 C<methods_via($class, $prefix, $crawl_upward)> 8927 8928C<methods_via> does the work of crawling up the C<@ISA> tree and reporting 8929all the parent class methods. C<$class> is the name of the next class to 8930try; C<$prefix> is the message prefix, which gets built up as we go up the 8931C<@ISA> tree to show parentage; C<$crawl_upward> is 1 if we should try to go 8932higher in the C<@ISA> tree, 0 if we should stop. 8933 8934=cut 8935 8936sub methods_via { 8937 8938 # If we've processed this class already, just quit. 8939 my $class = shift; 8940 return if $seen{$class}++; 8941 8942 # This is a package that is contributing the methods we're about to print. 8943 my $prefix = shift; 8944 my $prepend = $prefix ? "via $prefix: " : ''; 8945 my @to_print; 8946 8947 # Extract from all the symbols in this class. 8948 my $class_ref = do { no strict "refs"; \%{$class . '::'} }; 8949 while (my ($name, $glob) = each %$class_ref) { 8950 # references directly in the symbol table are Proxy Constant 8951 # Subroutines, and are by their very nature defined 8952 # Otherwise, check if the thing is a typeglob, and if it is, it decays 8953 # to a subroutine reference, which can be tested by defined. 8954 # $glob might also be the value -1 (from sub foo;) 8955 # or (say) '$$' (from sub foo ($$);) 8956 # \$glob will be SCALAR in both cases. 8957 if ((ref $glob || ($glob && ref \$glob eq 'GLOB' && defined &$glob)) 8958 && !$seen{$name}++) { 8959 push @to_print, "$prepend$name\n"; 8960 } 8961 } 8962 8963 { 8964 local $\ = ''; 8965 local $, = ''; 8966 print $DB::OUT $_ foreach sort @to_print; 8967 } 8968 8969 # If the $crawl_upward argument is false, just quit here. 8970 return unless shift; 8971 8972 # $crawl_upward true: keep going up the tree. 8973 # Find all the classes this one is a subclass of. 8974 my $class_ISA_ref = do { no strict "refs"; \@{"${class}::ISA"} }; 8975 for my $name ( @$class_ISA_ref ) { 8976 8977 # Set up the new prefix. 8978 $prepend = $prefix ? $prefix . " -> $name" : $name; 8979 8980 # Crawl up the tree and keep trying to crawl up. 8981 methods_via( $name, $prepend, 1 ); 8982 } 8983} ## end sub methods_via 8984 8985=head2 C<setman> - figure out which command to use to show documentation 8986 8987Just checks the contents of C<$^O> and sets the C<$doccmd> global accordingly. 8988 8989=cut 8990 8991sub setman { 8992 $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|NetWare)\z/s 8993 ? "man" # O Happy Day! 8994 : "perldoc"; # Alas, poor unfortunates 8995} ## end sub setman 8996 8997=head2 C<runman> - run the appropriate command to show documentation 8998 8999Accepts a man page name; runs the appropriate command to display it (set up 9000during debugger initialization). Uses C<_db_system()> to avoid mucking up the 9001program's STDIN and STDOUT. 9002 9003=cut 9004 9005sub runman { 9006 my $page = shift; 9007 unless ($page) { 9008 _db_system("$doccmd $doccmd"); 9009 return; 9010 } 9011 9012 # this way user can override, like with $doccmd="man -Mwhatever" 9013 # or even just "man " to disable the path check. 9014 if ( $doccmd ne 'man' ) { 9015 _db_system("$doccmd $page"); 9016 return; 9017 } 9018 9019 $page = 'perl' if lc($page) eq 'help'; 9020 9021 require Config; 9022 my $man1dir = $Config::Config{man1direxp}; 9023 my $man3dir = $Config::Config{man3direxp}; 9024 for ( $man1dir, $man3dir ) { s#/[^/]*\z## if /\S/ } 9025 my $manpath = ''; 9026 $manpath .= "$man1dir:" if $man1dir =~ /\S/; 9027 $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir; 9028 chop $manpath if $manpath; 9029 9030 # harmless if missing, I figure 9031 local $ENV{MANPATH} = $manpath if $manpath; 9032 my $nopathopt = $^O =~ /dunno what goes here/; 9033 if ( 9034 CORE::system( 9035 $doccmd, 9036 9037 # I just *know* there are men without -M 9038 ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ), 9039 split ' ', $page 9040 ) 9041 ) 9042 { 9043 unless ( $page =~ /^perl\w/ ) { 9044 # Previously the debugger contained a list which it slurped in, 9045 # listing the known "perl" manpages. However, it was out of date, 9046 # with errors both of omission and inclusion. This approach is 9047 # considerably less complex. The failure mode on a butchered 9048 # install is simply that the user has to run man or perldoc 9049 # "manually" with the full manpage name. 9050 9051 # There is a list of $^O values in installperl to determine whether 9052 # the directory is 'pods' or 'pod'. However, we can avoid tight 9053 # coupling to that by simply checking the "non-standard" 'pods' 9054 # first. 9055 my $pods = "$Config::Config{privlibexp}/pods"; 9056 $pods = "$Config::Config{privlibexp}/pod" 9057 unless -d $pods; 9058 if (-f "$pods/perl$page.pod") { 9059 CORE::system( $doccmd, 9060 ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ), 9061 "perl$page" ); 9062 } 9063 } 9064 } ## end if (CORE::system($doccmd... 9065} ## end sub runman 9066 9067#use Carp; # This did break, left for debugging 9068 9069=head1 DEBUGGER INITIALIZATION - THE SECOND BEGIN BLOCK 9070 9071Because of the way the debugger interface to the Perl core is designed, any 9072debugger package globals that C<DB::sub()> requires have to be defined before 9073any subroutines can be called. These are defined in the second C<BEGIN> block. 9074 9075This block sets things up so that (basically) the world is sane 9076before the debugger starts executing. We set up various variables that the 9077debugger has to have set up before the Perl core starts running: 9078 9079=over 4 9080 9081=item * 9082 9083The debugger's own filehandles (copies of STD and STDOUT for now). 9084 9085=item * 9086 9087Characters for shell escapes, the recall command, and the history command. 9088 9089=item * 9090 9091The maximum recursion depth. 9092 9093=item * 9094 9095The size of a C<w> command's window. 9096 9097=item * 9098 9099The before-this-line context to be printed in a C<v> (view a window around this line) command. 9100 9101=item * 9102 9103The fact that we're not in a sub at all right now. 9104 9105=item * 9106 9107The default SIGINT handler for the debugger. 9108 9109=item * 9110 9111The appropriate value of the flag in C<$^D> that says the debugger is running 9112 9113=item * 9114 9115The current debugger recursion level 9116 9117=item * 9118 9119The list of postponed items and the C<$single> stack (XXX define this) 9120 9121=item * 9122 9123That we want no return values and no subroutine entry/exit trace. 9124 9125=back 9126 9127=cut 9128 9129# The following BEGIN is very handy if debugger goes havoc, debugging debugger? 9130 9131use vars qw($db_stop); 9132 9133BEGIN { # This does not compile, alas. (XXX eh?) 9134 $IN = \*STDIN; # For bugs before DB::OUT has been opened 9135 $OUT = \*STDERR; # For errors before DB::OUT has been opened 9136 9137 # Define characters used by command parsing. 9138 $sh = '!'; # Shell escape (does not work) 9139 $rc = ','; # Recall command (does not work) 9140 @hist = ('?'); # Show history (does not work) 9141 @truehist = (); # Can be saved for replay (per session) 9142 9143 # This defines the point at which you get the 'deep recursion' 9144 # warning. It MUST be defined or the debugger will not load. 9145 $deep = 1000; 9146 9147 # Number of lines around the current one that are shown in the 9148 # 'w' command. 9149 $window = 10; 9150 9151 # How much before-the-current-line context the 'v' command should 9152 # use in calculating the start of the window it will display. 9153 $preview = 3; 9154 9155 # We're not in any sub yet, but we need this to be a defined value. 9156 $sub = ''; 9157 9158 # Set up the debugger's interrupt handler. It simply sets a flag 9159 # ($signal) that DB::DB() will check before each command is executed. 9160 $SIG{INT} = \&DB::catch; 9161 9162 # The following lines supposedly, if uncommented, allow the debugger to 9163 # debug itself. Perhaps we can try that someday. 9164 # This may be enabled to debug debugger: 9165 #$warnLevel = 1 unless defined $warnLevel; 9166 #$dieLevel = 1 unless defined $dieLevel; 9167 #$signalLevel = 1 unless defined $signalLevel; 9168 9169 # This is the flag that says "a debugger is running, please call 9170 # DB::DB and DB::sub". We will turn it on forcibly before we try to 9171 # execute anything in the user's context, because we always want to 9172 # get control back. 9173 $db_stop = 0; # Compiler warning ... 9174 $db_stop = 1 << 30; # ... because this is only used in an eval() later. 9175 9176 # This variable records how many levels we're nested in debugging. 9177 # Used in the debugger prompt, and in determining whether it's all over or 9178 # not. 9179 $level = 0; # Level of recursive debugging 9180 9181 # "Triggers bug (?) in perl if we postpone this until runtime." 9182 # XXX No details on this yet, or whether we should fix the bug instead 9183 # of work around it. Stay tuned. 9184 @stack = (0); 9185 9186 # Used to track the current stack depth using the auto-stacked-variable 9187 # trick. 9188 $stack_depth = 0; # Localized repeatedly; simple way to track $#stack 9189 9190 # Don't print return values on exiting a subroutine. 9191 $doret = -2; 9192 9193 # No extry/exit tracing. 9194 $frame = 0; 9195 9196} ## end BEGIN 9197 9198BEGIN { $^W = $ini_warn; } # Switch warnings back 9199 9200=head1 READLINE SUPPORT - COMPLETION FUNCTION 9201 9202=head2 db_complete 9203 9204C<readline> support - adds command completion to basic C<readline>. 9205 9206Returns a list of possible completions to C<readline> when invoked. C<readline> 9207will print the longest common substring following the text already entered. 9208 9209If there is only a single possible completion, C<readline> will use it in full. 9210 9211This code uses C<map> and C<grep> heavily to create lists of possible 9212completion. Think LISP in this section. 9213 9214=cut 9215 9216sub db_complete { 9217 9218 # Specific code for b c l V m f O, &blah, $blah, @blah, %blah 9219 # $text is the text to be completed. 9220 # $line is the incoming line typed by the user. 9221 # $start is the start of the text to be completed in the incoming line. 9222 my ( $text, $line, $start ) = @_; 9223 9224 # Save the initial text. 9225 # The search pattern is current package, ::, extract the next qualifier 9226 # Prefix and pack are set to undef. 9227 my ( $itext, $search, $prefix, $pack ) = 9228 ( $text, "^\Q${package}::\E([^:]+)\$" ); 9229 9230=head3 C<b postpone|compile> 9231 9232=over 4 9233 9234=item * 9235 9236Find all the subroutines that might match in this package 9237 9238=item * 9239 9240Add C<postpone>, C<load>, and C<compile> as possibles (we may be completing the keyword itself) 9241 9242=item * 9243 9244Include all the rest of the subs that are known 9245 9246=item * 9247 9248C<grep> out the ones that match the text we have so far 9249 9250=item * 9251 9252Return this as the list of possible completions 9253 9254=back 9255 9256=cut 9257 9258 return sort grep /^\Q$text/, ( keys %sub ), 9259 qw(postpone load compile), # subroutines 9260 ( map { /$search/ ? ($1) : () } keys %sub ) 9261 if ( substr $line, 0, $start ) =~ /^\|*[blc]\s+((postpone|compile)\s+)?$/; 9262 9263=head3 C<b load> 9264 9265Get all the possible files from C<@INC> as it currently stands and 9266select the ones that match the text so far. 9267 9268=cut 9269 9270 return sort grep /^\Q$text/, values %INC # files 9271 if ( substr $line, 0, $start ) =~ /^\|*b\s+load\s+$/; 9272 9273=head3 C<V> (list variable) and C<m> (list modules) 9274 9275There are two entry points for these commands: 9276 9277=head4 Unqualified package names 9278 9279Get the top-level packages and grab everything that matches the text 9280so far. For each match, recursively complete the partial packages to 9281get all possible matching packages. Return this sorted list. 9282 9283=cut 9284 9285 return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) } 9286 grep /^\Q$text/, map { /^(.*)::$/ ? ($1) : () } keys %:: # top-packages 9287 if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/ and $text =~ /^\w*$/; 9288 9289=head4 Qualified package names 9290 9291Take a partially-qualified package and find all subpackages for it 9292by getting all the subpackages for the package so far, matching all 9293the subpackages against the text, and discarding all of them which 9294start with 'main::'. Return this list. 9295 9296=cut 9297 9298 return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) } 9299 grep !/^main::/, grep /^\Q$text/, 9300 map { /^(.*)::$/ ? ( $prefix . "::$1" ) : () } 9301 do { no strict 'refs'; keys %{ $prefix . '::' } } 9302 if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/ 9303 and $text =~ /^(.*[^:])::?(\w*)$/ 9304 and $prefix = $1; 9305 9306=head3 C<f> - switch files 9307 9308Here, we want to get a fully-qualified filename for the C<f> command. 9309Possibilities are: 9310 9311=over 4 9312 9313=item 1. The original source file itself 9314 9315=item 2. A file from C<@INC> 9316 9317=item 3. An C<eval> (the debugger gets a C<(eval N)> fake file for each C<eval>). 9318 9319=back 9320 9321=cut 9322 9323 if ( $line =~ /^\|*f\s+(.*)/ ) { # Loaded files 9324 # We might possibly want to switch to an eval (which has a "filename" 9325 # like '(eval 9)'), so we may need to clean up the completion text 9326 # before proceeding. 9327 $prefix = length($1) - length($text); 9328 $text = $1; 9329 9330=pod 9331 9332Under the debugger, source files are represented as C<_E<lt>/fullpath/to/file> 9333(C<eval>s are C<_E<lt>(eval NNN)>) keys in C<%main::>. We pull all of these 9334out of C<%main::>, add the initial source file, and extract the ones that 9335match the completion text so far. 9336 9337=cut 9338 9339 return sort 9340 map { substr $_, 2 + $prefix } grep /^_<\Q$text/, ( keys %main:: ), 9341 $0; 9342 } ## end if ($line =~ /^\|*f\s+(.*)/) 9343 9344=head3 Subroutine name completion 9345 9346We look through all of the defined subs (the keys of C<%sub>) and 9347return both all the possible matches to the subroutine name plus 9348all the matches qualified to the current package. 9349 9350=cut 9351 9352 if ( ( substr $text, 0, 1 ) eq '&' ) { # subroutines 9353 $text = substr $text, 1; 9354 $prefix = "&"; 9355 return sort map "$prefix$_", grep /^\Q$text/, ( keys %sub ), 9356 ( 9357 map { /$search/ ? ($1) : () } 9358 keys %sub 9359 ); 9360 } ## end if ((substr $text, 0, ... 9361 9362=head3 Scalar, array, and hash completion: partially qualified package 9363 9364Much like the above, except we have to do a little more cleanup: 9365 9366=cut 9367 9368 if ( $text =~ /^[\$@%](.*)::(.*)/ ) { # symbols in a package 9369 9370=pod 9371 9372=over 4 9373 9374=item * 9375 9376Determine the package that the symbol is in. Put it in C<::> (effectively C<main::>) if no package is specified. 9377 9378=cut 9379 9380 $pack = ( $1 eq 'main' ? '' : $1 ) . '::'; 9381 9382=pod 9383 9384=item * 9385 9386Figure out the prefix vs. what needs completing. 9387 9388=cut 9389 9390 $prefix = ( substr $text, 0, 1 ) . $1 . '::'; 9391 $text = $2; 9392 9393=pod 9394 9395=item * 9396 9397Look through all the symbols in the package. C<grep> out all the possible hashes/arrays/scalars, and then C<grep> the possible matches out of those. C<map> the prefix onto all the possibilities. 9398 9399=cut 9400 9401 my @out = do { 9402 no strict 'refs'; 9403 map "$prefix$_", grep /^\Q$text/, grep /^_?[a-zA-Z]/, 9404 keys %$pack; 9405 }; 9406 9407=pod 9408 9409=item * 9410 9411If there's only one hit, and it's a package qualifier, and it's not equal to the initial text, re-complete it using the symbol we actually found. 9412 9413=cut 9414 9415 if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) { 9416 return db_complete( $out[0], $line, $start ); 9417 } 9418 9419 # Return the list of possibles. 9420 return sort @out; 9421 9422 } ## end if ($text =~ /^[\$@%](.*)::(.*)/) 9423 9424=pod 9425 9426=back 9427 9428=head3 Symbol completion: current package or package C<main>. 9429 9430=cut 9431 9432 if ( $text =~ /^[\$@%]/ ) { # symbols (in $package + packages in main) 9433=pod 9434 9435=over 4 9436 9437=item * 9438 9439If it's C<main>, delete main to just get C<::> leading. 9440 9441=cut 9442 9443 $pack = ( $package eq 'main' ? '' : $package ) . '::'; 9444 9445=pod 9446 9447=item * 9448 9449We set the prefix to the item's sigil, and trim off the sigil to get the text to be completed. 9450 9451=cut 9452 9453 $prefix = substr $text, 0, 1; 9454 $text = substr $text, 1; 9455 9456 my @out; 9457 9458=pod 9459 9460=item * 9461 9462We look for the lexical scope above DB::DB and auto-complete lexical variables 9463if PadWalker could be loaded. 9464 9465=cut 9466 9467 if (not $text =~ /::/ and eval { 9468 local @INC = @INC; 9469 pop @INC if $INC[-1] eq '.'; 9470 require PadWalker } ) { 9471 my $level = 1; 9472 while (1) { 9473 my @info = caller($level); 9474 $level++; 9475 $level = -1, last 9476 if not @info; 9477 last if $info[3] eq 'DB::DB'; 9478 } 9479 if ($level > 0) { 9480 my $lexicals = PadWalker::peek_my($level); 9481 push @out, grep /^\Q$prefix$text/, keys %$lexicals; 9482 } 9483 } 9484 9485=pod 9486 9487=item * 9488 9489If the package is C<::> (C<main>), create an empty list; if it's something else, create a list of all the packages known. Append whichever list to a list of all the possible symbols in the current package. C<grep> out the matches to the text entered so far, then C<map> the prefix back onto the symbols. 9490 9491=cut 9492 9493 push @out, map "$prefix$_", grep /^\Q$text/, 9494 ( grep /^_?[a-zA-Z]/, do { no strict 'refs'; keys %$pack } ), 9495 ( $pack eq '::' ? () : ( grep /::$/, keys %:: ) ); 9496 9497=item * 9498 9499If there's only one hit, it's a package qualifier, and it's not equal to the initial text, recomplete using this symbol. 9500 9501=back 9502 9503=cut 9504 9505 if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) { 9506 return db_complete( $out[0], $line, $start ); 9507 } 9508 9509 # Return the list of possibles. 9510 return sort @out; 9511 } ## end if ($text =~ /^[\$@%]/) 9512 9513=head3 Options 9514 9515We use C<option_val()> to look up the current value of the option. If there's 9516only a single value, we complete the command in such a way that it is a 9517complete command for setting the option in question. If there are multiple 9518possible values, we generate a command consisting of the option plus a trailing 9519question mark, which, if executed, will list the current value of the option. 9520 9521=cut 9522 9523 if ( ( substr $line, 0, $start ) =~ /^\|*[oO]\b.*\s$/ ) 9524 { # Options after space 9525 # We look for the text to be matched in the list of possible options, 9526 # and fetch the current value. 9527 my @out = grep /^\Q$text/, @options; 9528 my $val = option_val( $out[0], undef ); 9529 9530 # Set up a 'query option's value' command. 9531 my $out = '? '; 9532 if ( not defined $val or $val =~ /[\n\r]/ ) { 9533 9534 # There's really nothing else we can do. 9535 } 9536 9537 # We have a value. Create a proper option-setting command. 9538 elsif ( $val =~ /\s/ ) { 9539 9540 # XXX This may be an extraneous variable. 9541 my $found; 9542 9543 # We'll want to quote the string (because of the embedded 9544 # whtespace), but we want to make sure we don't end up with 9545 # mismatched quote characters. We try several possibilities. 9546 foreach my $l ( split //, qq/\"\'\#\|/ ) { 9547 9548 # If we didn't find this quote character in the value, 9549 # quote it using this quote character. 9550 $out = "$l$val$l ", last if ( index $val, $l ) == -1; 9551 } 9552 } ## end elsif ($val =~ /\s/) 9553 9554 # Don't need any quotes. 9555 else { 9556 $out = "=$val "; 9557 } 9558 9559 # If there were multiple possible values, return '? ', which 9560 # makes the command into a query command. If there was just one, 9561 # have readline append that. 9562 $rl_attribs->{completer_terminator_character} = 9563 ( @out == 1 ? $out : '? ' ); 9564 9565 # Return list of possibilities. 9566 return sort @out; 9567 } ## end if ((substr $line, 0, ... 9568 9569=head3 Filename completion 9570 9571For entering filenames. We simply call C<readline>'s C<filename_list()> 9572method with the completion text to get the possible completions. 9573 9574=cut 9575 9576 return $term->filename_list($text); # filenames 9577 9578} ## end sub db_complete 9579 9580=head1 MISCELLANEOUS SUPPORT FUNCTIONS 9581 9582Functions that possibly ought to be somewhere else. 9583 9584=head2 end_report 9585 9586Say we're done. 9587 9588=cut 9589 9590sub end_report { 9591 local $\ = ''; 9592 print $OUT "Use 'q' to quit or 'R' to restart. 'h q' for details.\n"; 9593} 9594 9595=head2 clean_ENV 9596 9597If we have $ini_pids, save it in the environment; else remove it from the 9598environment. Used by the C<R> (restart) command. 9599 9600=cut 9601 9602sub clean_ENV { 9603 if ( defined($ini_pids) ) { 9604 $ENV{PERLDB_PIDS} = $ini_pids; 9605 } 9606 else { 9607 delete( $ENV{PERLDB_PIDS} ); 9608 } 9609} ## end sub clean_ENV 9610 9611# PERLDBf_... flag names from perl.h 9612our ( %DollarCaretP_flags, %DollarCaretP_flags_r ); 9613 9614BEGIN { 9615 %DollarCaretP_flags = ( 9616 PERLDBf_SUB => 0x01, # Debug sub enter/exit 9617 PERLDBf_LINE => 0x02, # Keep line # 9618 PERLDBf_NOOPT => 0x04, # Switch off optimizations 9619 PERLDBf_INTER => 0x08, # Preserve more data 9620 PERLDBf_SUBLINE => 0x10, # Keep subr source lines 9621 PERLDBf_SINGLE => 0x20, # Start with single-step on 9622 PERLDBf_NONAME => 0x40, # For _SUB: no name of the subr 9623 PERLDBf_GOTO => 0x80, # Report goto: call DB::goto 9624 PERLDBf_NAMEEVAL => 0x100, # Informative names for evals 9625 PERLDBf_NAMEANON => 0x200, # Informative names for anon subs 9626 PERLDBf_SAVESRC => 0x400, # Save source lines into @{"_<$filename"} 9627 PERLDB_ALL => 0x33f, # No _NONAME, _GOTO 9628 ); 9629 # PERLDBf_LINE also enables the actions of PERLDBf_SAVESRC, so the debugger 9630 # doesn't need to set it. It's provided for the benefit of profilers and 9631 # other code analysers. 9632 9633 %DollarCaretP_flags_r = reverse %DollarCaretP_flags; 9634} 9635 9636sub parse_DollarCaretP_flags { 9637 my $flags = shift; 9638 $flags =~ s/^\s+//; 9639 $flags =~ s/\s+$//; 9640 my $acu = 0; 9641 foreach my $f ( split /\s*\|\s*/, $flags ) { 9642 my $value; 9643 if ( $f =~ /^0x([[:xdigit:]]+)$/ ) { 9644 $value = hex $1; 9645 } 9646 elsif ( $f =~ /^(\d+)$/ ) { 9647 $value = int $1; 9648 } 9649 elsif ( $f =~ /^DEFAULT$/i ) { 9650 $value = $DollarCaretP_flags{PERLDB_ALL}; 9651 } 9652 else { 9653 $f =~ /^(?:PERLDBf_)?(.*)$/i; 9654 $value = $DollarCaretP_flags{ 'PERLDBf_' . uc($1) }; 9655 unless ( defined $value ) { 9656 print $OUT ( 9657 "Unrecognized \$^P flag '$f'!\n", 9658 "Acceptable flags are: " 9659 . join( ', ', sort keys %DollarCaretP_flags ), 9660 ", and hexadecimal and decimal numbers.\n" 9661 ); 9662 return undef; 9663 } 9664 } 9665 $acu |= $value; 9666 } 9667 $acu; 9668} 9669 9670sub expand_DollarCaretP_flags { 9671 my $DollarCaretP = shift; 9672 my @bits = ( 9673 map { 9674 my $n = ( 1 << $_ ); 9675 ( $DollarCaretP & $n ) 9676 ? ( $DollarCaretP_flags_r{$n} 9677 || sprintf( '0x%x', $n ) ) 9678 : () 9679 } 0 .. 31 9680 ); 9681 return @bits ? join( '|', @bits ) : 0; 9682} 9683 9684=over 4 9685 9686=item rerun 9687 9688Rerun the current session to: 9689 9690 rerun current position 9691 9692 rerun 4 command number 4 9693 9694 rerun -4 current command minus 4 (go back 4 steps) 9695 9696Whether this always makes sense, in the current context is unknowable, and is 9697in part left as a useful exercise for the reader. This sub returns the 9698appropriate arguments to rerun the current session. 9699 9700=cut 9701 9702sub rerun { 9703 my $i = shift; 9704 my @args; 9705 pop(@truehist); # strim 9706 unless (defined $truehist[$i]) { 9707 print "Unable to return to non-existent command: $i\n"; 9708 } else { 9709 $#truehist = ($i < 0 ? $#truehist + $i : $i > 0 ? $i : $#truehist); 9710 my @temp = @truehist; # store 9711 push(@DB::typeahead, @truehist); # saved 9712 @truehist = @hist = (); # flush 9713 @args = restart(); # setup 9714 get_list("PERLDB_HIST"); # clean 9715 set_list("PERLDB_HIST", @temp); # reset 9716 } 9717 return @args; 9718} 9719 9720=item restart 9721 9722Restarting the debugger is a complex operation that occurs in several phases. 9723First, we try to reconstruct the command line that was used to invoke Perl 9724and the debugger. 9725 9726=cut 9727 9728sub restart { 9729 # I may not be able to resurrect you, but here goes ... 9730 print $OUT 9731"Warning: some settings and command-line options may be lost!\n"; 9732 my ( @script, @flags, $cl ); 9733 9734 # If warn was on before, turn it on again. 9735 push @flags, '-w' if $ini_warn; 9736 9737 # Rebuild the -I flags that were on the initial 9738 # command line. 9739 for (@ini_INC) { 9740 push @flags, '-I', $_; 9741 } 9742 9743 # Turn on taint if it was on before. 9744 push @flags, '-T' if ${^TAINT}; 9745 9746 # Arrange for setting the old INC: 9747 # Save the current @init_INC in the environment. 9748 set_list( "PERLDB_INC", @ini_INC ); 9749 9750 # If this was a perl one-liner, go to the "file" 9751 # corresponding to the one-liner read all the lines 9752 # out of it (except for the first one, which is going 9753 # to be added back on again when 'perl -d' runs: that's 9754 # the 'require perl5db.pl;' line), and add them back on 9755 # to the command line to be executed. 9756 if ( $0 eq '-e' ) { 9757 my $lines = *{$main::{'_<-e'}}{ARRAY}; 9758 for ( 1 .. $#$lines ) { # The first line is PERL5DB 9759 chomp( $cl = $lines->[$_] ); 9760 push @script, '-e', $cl; 9761 } 9762 } ## end if ($0 eq '-e') 9763 9764 # Otherwise we just reuse the original name we had 9765 # before. 9766 else { 9767 @script = $0; 9768 } 9769 9770=pod 9771 9772After the command line has been reconstructed, the next step is to save 9773the debugger's status in environment variables. The C<DB::set_list> routine 9774is used to save aggregate variables (both hashes and arrays); scalars are 9775just popped into environment variables directly. 9776 9777=cut 9778 9779 # If the terminal supported history, grab it and 9780 # save that in the environment. 9781 set_list( "PERLDB_HIST", 9782 $term->Features->{getHistory} 9783 ? $term->GetHistory 9784 : @hist ); 9785 9786 # Find all the files that were visited during this 9787 # session (i.e., the debugger had magic hashes 9788 # corresponding to them) and stick them in the environment. 9789 my @had_breakpoints = keys %had_breakpoints; 9790 set_list( "PERLDB_VISITED", @had_breakpoints ); 9791 9792 # Save the debugger options we chose. 9793 set_list( "PERLDB_OPT", %option ); 9794 # set_list( "PERLDB_OPT", options2remember() ); 9795 9796 # Save the break-on-loads. 9797 set_list( "PERLDB_ON_LOAD", %break_on_load ); 9798 9799=pod 9800 9801The most complex part of this is the saving of all of the breakpoints. They 9802can live in an awful lot of places, and we have to go through all of them, 9803find the breakpoints, and then save them in the appropriate environment 9804variable via C<DB::set_list>. 9805 9806=cut 9807 9808 # Go through all the breakpoints and make sure they're 9809 # still valid. 9810 my @hard; 9811 for ( 0 .. $#had_breakpoints ) { 9812 9813 # We were in this file. 9814 my $file = $had_breakpoints[$_]; 9815 9816 # Grab that file's magic line hash. 9817 *dbline = $main::{ '_<' . $file }; 9818 9819 # Skip out if it doesn't exist, or if the breakpoint 9820 # is in a postponed file (we'll do postponed ones 9821 # later). 9822 next unless %dbline or $postponed_file{$file}; 9823 9824 # In an eval. This is a little harder, so we'll 9825 # do more processing on that below. 9826 ( push @hard, $file ), next 9827 if $file =~ /^\(\w*eval/; 9828 9829 # XXX I have no idea what this is doing. Yet. 9830 my @add; 9831 @add = %{ $postponed_file{$file} } 9832 if $postponed_file{$file}; 9833 9834 # Save the list of all the breakpoints for this file. 9835 set_list( "PERLDB_FILE_$_", %dbline, @add ); 9836 9837 # Serialize the extra data %breakpoints_data hash. 9838 # That's a bug fix. 9839 set_list( "PERLDB_FILE_ENABLED_$_", 9840 map { _is_breakpoint_enabled($file, $_) ? 1 : 0 } 9841 sort { $a <=> $b } keys(%dbline) 9842 ) 9843 } ## end for (0 .. $#had_breakpoints) 9844 9845 # The breakpoint was inside an eval. This is a little 9846 # more difficult. XXX and I don't understand it. 9847 foreach my $hard_file (@hard) { 9848 # Get over to the eval in question. 9849 *dbline = $main::{ '_<' . $hard_file }; 9850 my $quoted = quotemeta $hard_file; 9851 my %subs; 9852 for my $sub ( keys %sub ) { 9853 if (my ($n1, $n2) = $sub{$sub} =~ /\A$quoted:(\d+)-(\d+)\z/) { 9854 $subs{$sub} = [ $n1, $n2 ]; 9855 } 9856 } 9857 unless (%subs) { 9858 print {$OUT} 9859 "No subroutines in $hard_file, ignoring breakpoints.\n"; 9860 next; 9861 } 9862 LINES: foreach my $line ( keys %dbline ) { 9863 9864 # One breakpoint per sub only: 9865 my ( $offset, $found ); 9866 SUBS: foreach my $sub ( keys %subs ) { 9867 if ( 9868 $subs{$sub}->[1] >= $line # Not after the subroutine 9869 and ( 9870 not defined $offset # Not caught 9871 or $offset < 0 9872 ) 9873 ) 9874 { # or badly caught 9875 $found = $sub; 9876 $offset = $line - $subs{$sub}->[0]; 9877 if ($offset >= 0) { 9878 $offset = "+$offset"; 9879 last SUBS; 9880 } 9881 } ## end if ($subs{$sub}->[1] >=... 9882 } ## end for $sub (keys %subs) 9883 if ( defined $offset ) { 9884 $postponed{$found} = 9885 "break $offset if $dbline{$line}"; 9886 } 9887 else { 9888 print {$OUT} 9889 ("Breakpoint in ${hard_file}:$line ignored:" 9890 . " after all the subroutines.\n"); 9891 } 9892 } ## end for $line (keys %dbline) 9893 } ## end for (@hard) 9894 9895 # Save the other things that don't need to be 9896 # processed. 9897 set_list( "PERLDB_POSTPONE", %postponed ); 9898 set_list( "PERLDB_PRETYPE", @$pretype ); 9899 set_list( "PERLDB_PRE", @$pre ); 9900 set_list( "PERLDB_POST", @$post ); 9901 set_list( "PERLDB_TYPEAHEAD", @typeahead ); 9902 9903 # We are officially restarting. 9904 $ENV{PERLDB_RESTART} = 1; 9905 9906 # We are junking all child debuggers. 9907 delete $ENV{PERLDB_PIDS}; # Restore ini state 9908 9909 # Set this back to the initial pid. 9910 $ENV{PERLDB_PIDS} = $ini_pids if defined $ini_pids; 9911 9912=pod 9913 9914After all the debugger status has been saved, we take the command we built up 9915and then return it, so we can C<exec()> it. The debugger will spot the 9916C<PERLDB_RESTART> environment variable and realize it needs to reload its state 9917from the environment. 9918 9919=cut 9920 9921 # And run Perl again. Add the "-d" flag, all the 9922 # flags we built up, the script (whether a one-liner 9923 # or a file), add on the -emacs flag for a slave editor, 9924 # and then the old arguments. 9925 9926 return ($^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS); 9927 9928}; # end restart 9929 9930=back 9931 9932=head1 END PROCESSING - THE C<END> BLOCK 9933 9934Come here at the very end of processing. We want to go into a 9935loop where we allow the user to enter commands and interact with the 9936debugger, but we don't want anything else to execute. 9937 9938First we set the C<$finished> variable, so that some commands that 9939shouldn't be run after the end of program quit working. 9940 9941We then figure out whether we're truly done (as in the user entered a C<q> 9942command, or we finished execution while running nonstop). If we aren't, 9943we set C<$single> to 1 (causing the debugger to get control again). 9944 9945We then call C<DB::fake::at_exit()>, which returns the C<Use 'q' to quit ...> 9946message and returns control to the debugger. Repeat. 9947 9948When the user finally enters a C<q> command, C<$fall_off_end> is set to 99491 and the C<END> block simply exits with C<$single> set to 0 (don't 9950break, run to completion.). 9951 9952=cut 9953 9954END { 9955 $finished = 1 if $inhibit_exit; # So that some commands may be disabled. 9956 $fall_off_end = 1 unless $inhibit_exit; 9957 9958 # Do not stop in at_exit() and destructors on exit: 9959 if ($fall_off_end or $runnonstop) { 9960 save_hist(); 9961 } else { 9962 $DB::single = 1; 9963 DB::fake::at_exit(); 9964 } 9965} ## end END 9966 9967=head1 PRE-5.8 COMMANDS 9968 9969Some of the commands changed function quite a bit in the 5.8 command 9970realignment, so much so that the old code had to be replaced completely. 9971Because we wanted to retain the option of being able to go back to the 9972former command set, we moved the old code off to this section. 9973 9974There's an awful lot of duplicated code here. We've duplicated the 9975comments to keep things clear. 9976 9977=head2 Null command 9978 9979Does nothing. Used to I<turn off> commands. 9980 9981=cut 9982 9983sub cmd_pre580_null { 9984 9985 # do nothing... 9986} 9987 9988=head2 Old C<a> command. 9989 9990This version added actions if you supplied them, and deleted them 9991if you didn't. 9992 9993=cut 9994 9995sub cmd_pre580_a { 9996 my $xcmd = shift; 9997 my $cmd = shift; 9998 9999 # Argument supplied. Add the action. 10000 if ( $cmd =~ /^(\d*)\s*(.*)/ ) { 10001 10002 # If the line isn't there, use the current line. 10003 my $i = $1 || $line; 10004 my $j = $2; 10005 10006 # If there is an action ... 10007 if ( length $j ) { 10008 10009 # ... but the line isn't breakable, skip it. 10010 if ( $dbline[$i] == 0 ) { 10011 print $OUT "Line $i may not have an action.\n"; 10012 } 10013 else { 10014 10015 # ... and the line is breakable: 10016 # Mark that there's an action in this file. 10017 $had_breakpoints{$filename} |= 2; 10018 10019 # Delete any current action. 10020 $dbline{$i} =~ s/\0[^\0]*//; 10021 10022 # Add the new action, continuing the line as needed. 10023 $dbline{$i} .= "\0" . action($j); 10024 } 10025 } ## end if (length $j) 10026 10027 # No action supplied. 10028 else { 10029 10030 # Delete the action. 10031 $dbline{$i} =~ s/\0[^\0]*//; 10032 10033 # Mark as having no break or action if nothing's left. 10034 delete $dbline{$i} if $dbline{$i} eq ''; 10035 } 10036 } ## end if ($cmd =~ /^(\d*)\s*(.*)/) 10037} ## end sub cmd_pre580_a 10038 10039=head2 Old C<b> command 10040 10041Add breakpoints. 10042 10043=cut 10044 10045sub cmd_pre580_b { 10046 my $xcmd = shift; 10047 my $cmd = shift; 10048 my $dbline = shift; 10049 10050 # Break on load. 10051 if ( $cmd =~ /^load\b\s*(.*)/ ) { 10052 my $file = $1; 10053 $file =~ s/\s+$//; 10054 cmd_b_load($file); 10055 } 10056 10057 # b compile|postpone <some sub> [<condition>] 10058 # The interpreter actually traps this one for us; we just put the 10059 # necessary condition in the %postponed hash. 10060 elsif ( $cmd =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) { 10061 10062 # Capture the condition if there is one. Make it true if none. 10063 my $cond = length $3 ? $3 : '1'; 10064 10065 # Save the sub name and set $break to 1 if $1 was 'postpone', 0 10066 # if it was 'compile'. 10067 my ( $subname, $break ) = ( $2, $1 eq 'postpone' ); 10068 10069 # De-Perl4-ify the name - ' separators to ::. 10070 $subname =~ s/\'/::/g; 10071 10072 # Qualify it into the current package unless it's already qualified. 10073 $subname = "${package}::" . $subname 10074 unless $subname =~ /::/; 10075 10076 # Add main if it starts with ::. 10077 $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::"; 10078 10079 # Save the break type for this sub. 10080 $postponed{$subname} = $break ? "break +0 if $cond" : "compile"; 10081 } ## end elsif ($cmd =~ ... 10082 10083 # b <sub name> [<condition>] 10084 elsif ( $cmd =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) { 10085 my $subname = $1; 10086 my $cond = length $2 ? $2 : '1'; 10087 cmd_b_sub( $subname, $cond ); 10088 } 10089 # b <line> [<condition>]. 10090 elsif ( $cmd =~ /^(\d*)\s*(.*)/ ) { 10091 my $i = $1 || $dbline; 10092 my $cond = length $2 ? $2 : '1'; 10093 cmd_b_line( $i, $cond ); 10094 } 10095} ## end sub cmd_pre580_b 10096 10097=head2 Old C<D> command. 10098 10099Delete all breakpoints unconditionally. 10100 10101=cut 10102 10103sub cmd_pre580_D { 10104 my $xcmd = shift; 10105 my $cmd = shift; 10106 if ( $cmd =~ /^\s*$/ ) { 10107 print $OUT "Deleting all breakpoints...\n"; 10108 10109 # %had_breakpoints lists every file that had at least one 10110 # breakpoint in it. 10111 my $file; 10112 for $file ( keys %had_breakpoints ) { 10113 10114 # Switch to the desired file temporarily. 10115 local *dbline = $main::{ '_<' . $file }; 10116 10117 $max = $#dbline; 10118 my $was; 10119 10120 # For all lines in this file ... 10121 for my $i (1 .. $max) { 10122 10123 # If there's a breakpoint or action on this line ... 10124 if ( defined $dbline{$i} ) { 10125 10126 # ... remove the breakpoint. 10127 $dbline{$i} =~ s/^[^\0]+//; 10128 if ( $dbline{$i} =~ s/^\0?$// ) { 10129 10130 # Remove the entry altogether if no action is there. 10131 delete $dbline{$i}; 10132 } 10133 } ## end if (defined $dbline{$i... 10134 } ## end for my $i (1 .. $max) 10135 10136 # If, after we turn off the "there were breakpoints in this file" 10137 # bit, the entry in %had_breakpoints for this file is zero, 10138 # we should remove this file from the hash. 10139 if ( not $had_breakpoints{$file} &= ~1 ) { 10140 delete $had_breakpoints{$file}; 10141 } 10142 } ## end for $file (keys %had_breakpoints) 10143 10144 # Kill off all the other breakpoints that are waiting for files that 10145 # haven't been loaded yet. 10146 undef %postponed; 10147 undef %postponed_file; 10148 undef %break_on_load; 10149 } ## end if ($cmd =~ /^\s*$/) 10150} ## end sub cmd_pre580_D 10151 10152=head2 Old C<h> command 10153 10154Print help. Defaults to printing the long-form help; the 5.8 version 10155prints the summary by default. 10156 10157=cut 10158 10159sub cmd_pre580_h { 10160 my $xcmd = shift; 10161 my $cmd = shift; 10162 10163 # Print the *right* help, long format. 10164 if ( $cmd =~ /^\s*$/ ) { 10165 print_help($pre580_help); 10166 } 10167 10168 # 'h h' - explicitly-requested summary. 10169 elsif ( $cmd =~ /^h\s*/ ) { 10170 print_help($pre580_summary); 10171 } 10172 10173 # Find and print a command's help. 10174 elsif ( $cmd =~ /^h\s+(\S.*)$/ ) { 10175 my $asked = $1; # for proper errmsg 10176 my $qasked = quotemeta($asked); # for searching 10177 # XXX: finds CR but not <CR> 10178 if ( 10179 $pre580_help =~ /^ 10180 <? # Optional '<' 10181 (?:[IB]<) # Optional markup 10182 $qasked # The command name 10183 /mx 10184 ) 10185 { 10186 10187 while ( 10188 $pre580_help =~ /^ 10189 ( # The command help: 10190 <? # Optional '<' 10191 (?:[IB]<) # Optional markup 10192 $qasked # The command name 10193 ([\s\S]*?) # Lines starting with tabs 10194 \n # Final newline 10195 ) 10196 (?!\s)/mgx 10197 ) # Line not starting with space 10198 # (Next command's help) 10199 { 10200 print_help($1); 10201 } 10202 } ## end if ($pre580_help =~ /^<?(?:[IB]<)$qasked/m) 10203 10204 # Help not found. 10205 else { 10206 print_help("B<$asked> is not a debugger command.\n"); 10207 } 10208 } ## end elsif ($cmd =~ /^h\s+(\S.*)$/) 10209} ## end sub cmd_pre580_h 10210 10211=head2 Old C<W> command 10212 10213C<W E<lt>exprE<gt>> adds a watch expression, C<W> deletes them all. 10214 10215=cut 10216 10217sub cmd_pre580_W { 10218 my $xcmd = shift; 10219 my $cmd = shift; 10220 10221 # Delete all watch expressions. 10222 if ( $cmd =~ /^$/ ) { 10223 10224 # No watching is going on. 10225 $trace &= ~2; 10226 10227 # Kill all the watch expressions and values. 10228 @to_watch = @old_watch = (); 10229 } 10230 10231 # Add a watch expression. 10232 elsif ( $cmd =~ /^(.*)/s ) { 10233 10234 # add it to the list to be watched. 10235 push @to_watch, $1; 10236 10237 # Get the current value of the expression. 10238 # Doesn't handle expressions returning list values! 10239 $evalarg = $1; 10240 # The &-call is here to ascertain the mutability of @_. 10241 my ($val) = &DB::eval; 10242 $val = ( defined $val ) ? "'$val'" : 'undef'; 10243 10244 # Save it. 10245 push @old_watch, $val; 10246 10247 # We're watching stuff. 10248 $trace |= 2; 10249 10250 } ## end elsif ($cmd =~ /^(.*)/s) 10251} ## end sub cmd_pre580_W 10252 10253=head1 PRE-AND-POST-PROMPT COMMANDS AND ACTIONS 10254 10255The debugger used to have a bunch of nearly-identical code to handle 10256the pre-and-post-prompt action commands. C<cmd_pre590_prepost> and 10257C<cmd_prepost> unify all this into one set of code to handle the 10258appropriate actions. 10259 10260=head2 C<cmd_pre590_prepost> 10261 10262A small wrapper around C<cmd_prepost>; it makes sure that the default doesn't 10263do something destructive. In pre 5.8 debuggers, the default action was to 10264delete all the actions. 10265 10266=cut 10267 10268sub cmd_pre590_prepost { 10269 my $cmd = shift; 10270 my $line = shift || '*'; 10271 my $dbline = shift; 10272 10273 return cmd_prepost( $cmd, $line, $dbline ); 10274} ## end sub cmd_pre590_prepost 10275 10276=head2 C<cmd_prepost> 10277 10278Actually does all the handling for C<E<lt>>, C<E<gt>>, C<{{>, C<{>, etc. 10279Since the lists of actions are all held in arrays that are pointed to by 10280references anyway, all we have to do is pick the right array reference and 10281then use generic code to all, delete, or list actions. 10282 10283=cut 10284 10285sub cmd_prepost { 10286 my $cmd = shift; 10287 10288 # No action supplied defaults to 'list'. 10289 my $line = shift || '?'; 10290 10291 # Figure out what to put in the prompt. 10292 my $which = ''; 10293 10294 # Make sure we have some array or another to address later. 10295 # This means that if for some reason the tests fail, we won't be 10296 # trying to stash actions or delete them from the wrong place. 10297 my $aref = []; 10298 10299 # < - Perl code to run before prompt. 10300 if ( $cmd =~ /^\</o ) { 10301 $which = 'pre-perl'; 10302 $aref = $pre; 10303 } 10304 10305 # > - Perl code to run after prompt. 10306 elsif ( $cmd =~ /^\>/o ) { 10307 $which = 'post-perl'; 10308 $aref = $post; 10309 } 10310 10311 # { - first check for properly-balanced braces. 10312 elsif ( $cmd =~ /^\{/o ) { 10313 if ( $cmd =~ /^\{.*\}$/o && unbalanced( substr( $cmd, 1 ) ) ) { 10314 print $OUT 10315"$cmd is now a debugger command\nuse ';$cmd' if you mean Perl code\n"; 10316 } 10317 10318 # Properly balanced. Pre-prompt debugger actions. 10319 else { 10320 $which = 'pre-debugger'; 10321 $aref = $pretype; 10322 } 10323 } ## end elsif ( $cmd =~ /^\{/o ) 10324 10325 # Did we find something that makes sense? 10326 unless ($which) { 10327 print $OUT "Confused by command: $cmd\n"; 10328 } 10329 10330 # Yes. 10331 else { 10332 10333 # List actions. 10334 if ( $line =~ /^\s*\?\s*$/o ) { 10335 unless (@$aref) { 10336 10337 # Nothing there. Complain. 10338 print $OUT "No $which actions.\n"; 10339 } 10340 else { 10341 10342 # List the actions in the selected list. 10343 print $OUT "$which commands:\n"; 10344 foreach my $action (@$aref) { 10345 print $OUT "\t$cmd -- $action\n"; 10346 } 10347 } ## end else 10348 } ## end if ( $line =~ /^\s*\?\s*$/o) 10349 10350 # Might be a delete. 10351 else { 10352 if ( length($cmd) == 1 ) { 10353 if ( $line =~ /^\s*\*\s*$/o ) { 10354 10355 # It's a delete. Get rid of the old actions in the 10356 # selected list.. 10357 @$aref = (); 10358 print $OUT "All $cmd actions cleared.\n"; 10359 } 10360 else { 10361 10362 # Replace all the actions. (This is a <, >, or {). 10363 @$aref = action($line); 10364 } 10365 } ## end if ( length($cmd) == 1) 10366 elsif ( length($cmd) == 2 ) { 10367 10368 # Add the action to the line. (This is a <<, >>, or {{). 10369 push @$aref, action($line); 10370 } 10371 else { 10372 10373 # <<<, >>>>, {{{{{{ ... something not a command. 10374 print $OUT 10375 "Confused by strange length of $which command($cmd)...\n"; 10376 } 10377 } ## end else [ if ( $line =~ /^\s*\?\s*$/o) 10378 } ## end else 10379} ## end sub cmd_prepost 10380 10381=head1 C<DB::fake> 10382 10383Contains the C<at_exit> routine that the debugger uses to issue the 10384C<Debugged program terminated ...> message after the program completes. See 10385the C<END> block documentation for more details. 10386 10387=cut 10388 10389package DB::fake; 10390 10391sub at_exit { 10392 "Debugged program terminated. Use 'q' to quit or 'R' to restart."; 10393} 10394 10395package DB; # Do not trace this 1; below! 10396 103971; 10398 10399 10400