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

On further thought, the line-search should be a "watch" and not a "breakpoint," as every breakpoint must be associated with a line. "b expr" tests expr on the current line, not every line!

And now that I've figured that out, I've found the wisdom I seek, based on the search result changing state

w $main::{"_<".(caller 2)[1]}[(caller 2)[2]] =~ /\bprint\b/
I welcome any improvements- such as
  1. not having to call "caller 2" twice
  2. have the expression only change value when it first hits the "print" statment, and not when it goes to the next line- perhaps by using the flip-flop operator
  3. somehow using perl5db's English-named variables

Replies are listed 'Best First'.
Re^3: Make debugger break on source lines matching a pattern
by LanX (Saint) on Jan 11, 2014 at 22:23 UTC
    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)

      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)

Re^3: Make debugger break on source lines matching a pattern
by LanX (Saint) on Jan 11, 2014 at 21:39 UTC
    This really works???

    Anyway I think I have a better idea, you can use this hack to evaluate code within a pseudo-var

    DB<100> w @{[$z++]}

    this watch-point will break at each line, cause the value changes.

    Now if you include a condition to change only, if your filter matches, you got what you need! :)

    edit

    DB<101> w @{[$z++]} DB<102> r 0 Watchpoint 0: @{[$z++]} changed: old value: '0' new value: '1' main::(tst.pl:12): say $x++; DB<102> r 1 Watchpoint 0: @{[$z++]} changed: old value: '1' new value: '2' main::(tst.pl:13): print $x++;

    Cheers Rolf

    ( addicted to the Perl Programming Language)