add an RBN line to progress
[spider.git] / perl / DXDebug.pm
index 25d742250a6572037ee6f4589a2cf54a4bd4a53f..28ae8fe56281137a056bac41954fa6013c1f8481 100644 (file)
 
 package DXDebug;
 
+use 5.10.1;
+
 require Exporter;
 @ISA = qw(Exporter);
-@EXPORT = qw(dbginit dbg dbgadd dbgsub dbglist dbgdump isdbg dbgclose confess croak cluck carp);
+@EXPORT = qw(dbginit dbg dbgadd dbgsub dbglist dbgdump isdbg dbgclose dbgtrace confess croak cluck carp);
 
 use strict;
 use vars qw(%dbglevel $fp $callback $cleandays $keepdays $dbgringlth);
@@ -54,23 +56,27 @@ if (!defined $DB::VERSION) {
            \$SIG{__DIE__} = 'DEFAULT'; 
         DXDebug::dbgprintring() if DXDebug::isdbg('nologchan');
         DXDebug::dbg(\$@);
-               DXDebug::dbg(Carp::shortmess(\@_));
+#              DXDebug::dbg(Carp::shortmess(\@_));
+        DXDebug::longmess(\@_);
            exit(-1); 
        }
        sub croak { 
                \$SIG{__DIE__} = 'DEFAULT'; 
         DXDebug::dbgprintring() if DXDebug::isdbg('nologchan');
         DXDebug::dbg(\$@);
-               DXDebug::dbg(Carp::longmess(\@_));
+#              DXDebug::dbg(Carp::longmess(\@_));
+        DXDebug::shortmess(\@_);
                exit(-1); 
        }
        sub carp { 
         DXDebug::dbgprintring(25) if DXDebug('nologchan');
-        DXDebug::dbg(Carp::shortmess(\@_)); 
+#        DXDebug::dbg(Carp::shortmess(\@_)); 
+        DXDebug::longmess(\@_);
     }
        sub cluck { 
         DXDebug::dbgprintring(25) if DXDebug('nologchan');
-        DXDebug::dbg(Carp::longmess(\@_)); 
+#        DXDebug::dbg(Carp::longmess(\@_)); 
+        DXDebug::longmess(\@_);
     } );
 
     CORE::die(Carp::shortmess($@)) if $@;
@@ -83,7 +89,25 @@ if (!defined $DB::VERSION) {
 } 
 
 
-my $_isdbg;                                            # current dbg level we are processing
+my $_isdbg = '';                                               # current dbg level we are processing
+
+# print stack trace
+sub dbgtrace
+{
+#      say "*** in dbgtrace";
+       $_isdbg = 'trace';
+       dbg(@_);
+       for (my $i = 1; (my ($pkg, $fn, $l, $subr) = caller($i)); ++$i) {
+#              say "*** in dbgtrace $i";
+               next if $pkg eq 'DXDebug';
+#              say "*** in dbgtrace after package";
+               last if $pkg =~ /Mojo/;
+#              say "*** in dbgtrace $i after mojo";
+               $_isdbg = 'trace';
+               dbg("Stack ($i): $pkg::$subr in $fn line: $l");
+       }
+       $_isdbg = '';
+}
 
 sub dbg
 {
@@ -106,7 +130,6 @@ sub dbg
                        $fp->writeunix($t, $str) unless !$fp || $dbglevel{"nolog$_isdbg"} ; 
                }
        }
-       $_isdbg = '';
 }
 
 sub dbginit
@@ -207,22 +230,24 @@ sub isdbg($)
 
 sub shortmess 
 {
-       return Carp::shortmess(@_);
+       return dbgtrace(@_);
 }
 
 sub longmess 
 {
-       return Carp::longmess(@_);
+       return dbgtrace(@_);
 }
 
 sub dbgprintring
 {
        return unless $fp;
-       my $count = shift;
+       my $i = shift || 0;
+       my $count = @dbgring;
+       $i =  @dbgring-$i if $i;
+       return 0 unless $i < $count;    # do nothing if there is nothing to print
+
        my $first;
        my $l;
-       my $i = defined $count ? @dbgring-$count : 0;
-       $count = @dbgring;
        for ( ; $i < $count; ++$i) {
                my ($t, $str) = split /\^/, $dbgring[$i], 2;
                next unless $t;
@@ -235,11 +260,13 @@ sub dbgprintring
                }
                my $buf = sprintf "%02d:%02d:%02d", (gmtime($t))[2,1,0];
                $fp->writeunix($lt, "$lt^RING: $buf^$str");
+               ++$l;
        }
        my $et = time;
        $fp->writeunix($et, "$et^###");
-       $fp->writeunix($et, "$et^### RINGBUFFER END");
+       $fp->writeunix($et, "$et^### RINGBUFFER END $l debug lines written");
        $fp->writeunix($et, "$et^###");
+       return $l;
 }
 
 sub dbgclearring