in reply to Re^2: Make debugger break on source lines matching a pattern
in thread Make debugger break on source lines matching a pattern

OK changing it to (caller 3) made it work for me! =)

DB<100> w $main::{"_<".(caller 3)[1]}[(caller 3)[2]] =~ /\bprint\b/ DB<101> r 0 1 Watchpoint 0: $main::{"_<".(caller 3)[1]}[(caller 3)[2]] =~ /\bprin +t\b/ changed: old value: '' new value: '1' main::(tst.pl:13): print $x++;

my suggestion is to define a new debugger command for "global-break-line" via an alias like bl in your '.perldb'.

Like that  bl REGEX is translated to w @{ [ DB::breakline(regex) ] }

sub DB::breakline { } is also defined in '.perldb' and handles the details to access the line's source and to return a new value.

tomorrow more!

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^4: Make debugger break on source lines matching a pattern
by Yary (Pilgrim) on Jan 12, 2014 at 00:41 UTC
    We must have different versions of perl, with different call-stack depths in our debuggers.

    Using a counter is a simple way of having the state change only before the matching line, and not after:

    w $::ctr+=$::{"_<".(caller 3)[1]}[(caller 3)[2]] =~ /\bprint\b/
    The bistable flip-flop seems like it should be perfect for this case, if you take care to use a non-constant always-true expression for the right hand side. Seems like it should. I can't get it to work properly. And now I'm spending more time playing with the debugger than debugging!

    But it sure is a fun challenge.

      > The bistable flip-flop seems like it should be perfect for this case, ... I can't get it to work properly.

      IIRC are watchpoints evaluated code-snippets. Flip-flops are anchored in the op-tree but recompiling generates each time a new op-tree.

      > We must have different versions of perl,

      Not sure, I patched my local copy of .perldb a lot...

      ...

      Yep sorry, mea culpa, emptying my local .perldb makes (caller 2) working.

      ...

      Indeed, this watchpoint shows that my patching DB::eval() introduced a new call-frame

      Watchpoint 0: @{[ $z++, map { (caller $_)[0..3],"\n" } 1..3 ]} chan +ged: old value: '0', 'DB', '/home/lanx/.perldb', '3', 'DB::eval', ' ', 'DB', '/usr/share/perl/5.10/perl5db.pl', '1953', 'DB::new_eval', ' ', 'Config', '/usr/lib/perl/5.10/Config.pm', '62', 'DB::DB', ' '

      ( have to consider using goto )

      > And now I'm spending more time playing with the debugger than debugging!

      Indeed! ( Welcome in the brotherhood ;-)

      > But it sure is a fun challenge.

      If you liked this, you might be interested in this: =)

      YAPC::EU::2012 "IPL - From Debugger to Interactive Shell"

      See also linked slides and code, it shows some techniques to patch perl5db for your needs.

      Cheers Rolf

      ( addicted to the Perl Programming Language)