in reply to Re^2: Debugging a program
in thread Debugging a program

Thanks, that saves the action of setting a breakpoint.

But even better, I could shift the signal handler code into the debugger initialization file .perldb. Then I do not have to modify the original source code. Works great!

This is the content of file .perldb (place it in the current or in the home directory):

sub afterinit { $::SIG{'__WARN__'} = sub { my $warning = shift; if ( $warning =~ m{\s at \s \S+ \s line \s \d+ \. $}xms ) { $DB::single = 1; # debugger stops here automatically } warn $warning; }; print "sigwarn handler installed!\n"; return; }

Replies are listed 'Best First'.
Re^4: Debugging a program
by hexcoder (Deacon) on Jul 18, 2016 at 11:59 UTC
    ... and under Windows save it to file perldb.ini in your %HOMEDRIVE%%HOMEPATH% directory.

    Then make sure to set the file attributes to read-only. That way it is safe and the debugger is happy.

      With Strawberry Perl 5.26.2 (Windows 7) I got some complaints about unknown terminal window size when starting the debugger.
      Unable to get Terminal Size. The Win32 GetConsoleScreenBufferInfo call + didn't work. The COLUMNS and LINES environment variables didn't work +. at C:/Strawberry/perl/vendor/lib/Term/ReadLine/ line 410 +.

      These lines in sub afterinit take care of it:
      my ($cols, $lines) = split ' ', (grep { m{^\s*\d+\s+\d+\s}xms } `p +owershell -command "&{\$H=get-host;\$H.ui.rawui.WindowSize;}"`)[0]; $ENV{'COLUMNS'} = $cols; $ENV{'LINES'} = $lines; print "COLUMNS and LINES are set ($cols,$lines).\n";

      Powershell is used here to get the console property WindowSize. Then the environment variables COLUMNS and LINES are locally set and the module is happy.


        I'd prob do it this way:

        my( $cols, $lines ) = qx( powershell -command "&{ \$H=get-host; \$H.ui +.rawui.WindowSize.Width; \$H.ui.rawui.WindowSize.Height; }" ) =~ /(\d ++)/g;
        I reckon we are the only monastery ever to have a dungeon stuffed with 16,000 zombies.
        When using Tk, I observed that my custom debugging signal handler for $SIG{__WARN__} is overwritten by Tk :(.
        So I needed to reoverwrite it after use Tk; with my own one again.

        use Tk; ... # if running with debugger, reinstall signal handler if (defined $DB::single) { # avoid warning: '$DB::single' is only used once $DB::single = $DB::single; DB::afterinit(); }
        Unfortunately this requires modification of the script.

        Any suggestions for enhancements are welcome.