qleem has asked for the wisdom of the Perl Monks concerning the following question:

I seek the wisdom of the monks: In order to diagnose some problems in caller scripts, I included the guts of Devel::Caller::Perl at the bottom of my script so I can see the arguments subs were called with in the error logs.
#!/usr/bin/perl use strict; use warnings; print 1; #insert __END__ here and debugger works fine use DB; sub import { *{(caller)[0].'::called_args'} = \&called_args if $_[1] eq 'called_args'; } sub called_args { &DB::called_args } package DB; sub called_args { my ($level) = @_; my @foo = caller( ( $level || 0 ) + 3 ); wantarray ? @DB::args : \@DB::args; }
Including this code causes the script to run to completion and exit when called with  perl -d myscript.pl Works fine when removed. I'm guessing messing with the definition of the DB package is overwriting something I shouldn't be. I was hoping the monks could shed some light as to what's going on and how to work around it or do it correctly. Thanks!

Replies are listed 'Best First'.
Re: Debugger doesn't interrupt
by Mr. Muskrat (Canon) on Jun 27, 2014 at 18:24 UTC
Re: Debugger doesn't interrupt # caller() in DB:: context
by LanX (Saint) on Jun 27, 2014 at 22:29 UTC
    Just don't mess with the debugger's own namesspace DB:: !

    I don't understand the purpose of all those indirections anyway.

    Cleaning up the code helps:

    #!/usr/bin/perl use strict; use warnings; $|=1; print "1\n"; sub caller_args { # NB: renamed my ($level) = @_; { package DB; () = caller( ( $level || 0 ) + 1 ); } wantarray ? @DB::args : [@DB::args]; # NB: returning a ref \@DB::args was dangerous } sub tst { local $\="\n"; print "\@_ = @_"; print "called_args = ", join (" ", caller_args(0)); } tst(1..3);

    See caller for details.

    w/o debuger

    > perl tst.pl 1 @_ = 1 2 3 called_args = 1 2 3

    with debugger

    > perl -d tst.pl Loading DB routines from perl5db.pl version 1.3 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(tst.pl:5): $|=1; DB<100> n main::(tst.pl:7): print "1\n"; DB<100> 1 main::(tst.pl:25): tst(1..3); DB<100> @_ = 1 2 3 called_args = 1 2 3 Debugged program terminated. Use q to quit or R to restart, use o inhibit_exit to avoid stopping after program termination, h q, h R or h o to get additional info.

    Cheers Rolf

    (addicted to the Perl Programming Language)

Re: Debugger doesn't interrupt
by LanX (Saint) on Jun 26, 2014 at 21:16 UTC
    Yes its messing with internals.

    But shouldn't you ask the module's author?

    Cheers Rolf

    (addicted to the Perl Programming Language)