Hi folks,

I recently stumbled upon a weird behaviour of the perl debugger that regularly causes me a hard time debugging because it stops with a DB prompt somewhere in the vague depth. Tried perl versions 5.14.2 and 5.18.2, both versions are affected. Destilled the behaviour to the following tiny script:

#!perl -d use strict; package Obj; use overload q{""} => 'string'; sub new { bless { string => pop }, shift } sub dostuff () {} sub string { dostuff; # These naughty lines (in a real module dostuff; # they'd do probably something useful) simply dostuff; # want to waste your time when debugging! dostuff; # There is no exit, is one? dostuff; # Thought there is a difference between dostuff; # "n test" and "s test"? - Nope! dostuff; # Try to "r"eturn, too - turns out it dostuff; # takes you further than you intended. dostuff; # Here comes "c 20" to your sole rescue: dostuff; # It will graciously take you up to shift->{string} # this line. Counting lines is fun, you know! } sub reply { print "Hi lonely one!\n"; } package main; sub test { my $o = Obj->new("World"); print "Hello $o!\n"; $o->reply(); } test; # ... this by debugger command "s", then "s test" and/or "n test +" __END__

Here is my debugging session:

$ perl debugtest.pl Loading DB routines from perl5db.pl version 1.39_10 Editor support available. Enter h or 'h h' for help, or 'man perldebug' for more help. main::(debugtest.pl:35): test; # ... this by debugger command " +s", then "s test" and/or "n test" DB<1> s main::test(debugtest.pl:30): my $o = Obj->new("World"); DB<1> n main::test(debugtest.pl:31): print "Hello $o!\n"; DB<1> Hello World! main::test(debugtest.pl:32): $o->reply(); DB<1> Hi lonely one! 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. DB<1> R Warning: some settings and command-line options may be lost! Loading DB routines from perl5db.pl version 1.39_10 Editor support available. Enter h or 'h h' for help, or 'man perldebug' for more help. main::(debugtest.pl:35): test; # ... this by debugger command " +s", then "s test" and/or "n test" DB<0> s test main::((eval 5)[/usr/share/perl5/core_perl/perl5db.pl:732]:3): 3: test; DB<<1>> s main::test(debugtest.pl:30): my $o = Obj->new("World"); DB<<1>> n main::test(debugtest.pl:31): print "Hello $o!\n"; DB<<1>> main::test(debugtest.pl:10): dostuff; # These naughty lines (i +n a real module DB<<1>> main::test(debugtest.pl:11): dostuff; # they'd do probably som +ething useful) simply DB<<1>> main::test(debugtest.pl:12): dostuff; # want to waste your tim +e when debugging! DB<<1>> main::test(debugtest.pl:13): dostuff; # There is no exit, is o +ne? DB<<1>> main::test(debugtest.pl:14): dostuff; # Thought there is a dif +ference between DB<<1>> main::test(debugtest.pl:15): dostuff; # "n test" and "s test"? + - Nope! DB<<1>> main::test(debugtest.pl:16): dostuff; # Try to "r"eturn, too - + turns out it DB<<1>> main::test(debugtest.pl:17): dostuff; # takes you further than + you intended. DB<<1>> main::test(debugtest.pl:18): dostuff; # Here comes "c 20" to y +our sole rescue: DB<<1>> main::test(debugtest.pl:19): dostuff; # It will graciously tak +e you up to DB<<1>> main::test(debugtest.pl:20): shift->{string} # this line. Coun +ting lines is fun, you know! DB<<1>> Hello World! main::test(debugtest.pl:32): $o->reply(); DB<<1>> Hi lonely one! DB<1> Hello World! Hi lonely one! 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. DB<1> R Warning: some settings and command-line options may be lost! Loading DB routines from perl5db.pl version 1.39_10 Editor support available. Enter h or 'h h' for help, or 'man perldebug' for more help. main::(debugtest.pl:35): test; # ... this by debugger command " +s", then "s test" and/or "n test" DB<1> n test main::((eval 5)[/usr/share/perl5/core_perl/perl5db.pl:732]:3): 3: test; DB<<2>> s main::test(debugtest.pl:30): my $o = Obj->new("World"); DB<<2>> n main::test(debugtest.pl:31): print "Hello $o!\n"; DB<<2>> main::test(debugtest.pl:10): dostuff; # These naughty lines (i +n a real module DB<<2>> q

The respective string method in my real project is even stepped into from a dunno-how related Moose object accessor. To find myself thrown into that method every once in a while makes debugging tedious, so I would like to work around it. It seems to be a bug in the debugger, in overload pragma perhaps (forgotten $DB::single assignment?), in them both or just in my thinking.

What do you think and why, I appreciate your advice!

-- flowdy


In reply to Triggered overload handlers always stepped into in debugger after n or s <EXPR> by flowdy

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.