Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Triggered overload handlers always stepped into in debugger after n or s <EXPR>

by flowdy (Scribe)
on Mar 10, 2014 at 18:44 UTC ( [id://1077739]=perlquestion: print w/replies, xml ) Need Help??

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

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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1077739]
Approved by davido
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2024-04-18 00:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found