stop crash if node adds itself in pc92
[spider.git] / perl / DXDebug.pm
index d901c6b5b047bb5a7951bca67b3104d30229b672..9084062c0226020bd9c7aea2f32e2354b466ee48 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 dbgprintring 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 $@;
@@ -85,6 +91,24 @@ if (!defined $DB::VERSION) {
 
 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
 {
 #      return unless $fp;
@@ -95,8 +119,8 @@ sub dbg
                my @l = split /\n/, $r;
                foreach my $l (@l) {
                        $l =~ s/([\x00-\x08\x0B-\x1f\x7f-\xff])/sprintf("%%%02X",ord($1))/eg;
-                       print "$l\n" if defined \*STDOUT && !$no_stdout;
                        my $tag = $_isdbg ? "($_isdbg) " : '(*) ';
+                       print "$tag$l\n" if defined \*STDOUT && !$no_stdout;
                        my $str = "$t^$tag$l";
                        &$callback($str) if $callback;
                        if ($dbgringlth) {
@@ -159,6 +183,7 @@ sub dbgdump
        my $l = shift;
        my $m = shift;
        if ($dbglevel{$l} || $l eq 'err') {
+               my @out;
                foreach my $l (@_) {
                        for (my $o = 0; $o < length $l; $o += 16) {
                                my $c = substr $l, $o, 16;
@@ -166,11 +191,12 @@ sub dbgdump
                                $c =~ s/[\x00-\x1f\x7f-\xff]/./g;
                                my $left = 16 - length $c;
                                $h .= ' ' x (2 * $left) if $left > 0;
-                               dbg($m . sprintf("%4d:", $o) . "$h $c");
+                               push @out, $m . sprintf("%4d:", $o) . "$h $c";
                                $m = ' ' x (length $m);
                        }
                }
-       }
+               dbg(@out) if isdbg($l); # yes, I know, I have my reasons;
+       } 
 }
 
 sub dbgadd
@@ -207,12 +233,12 @@ sub isdbg($)
 
 sub shortmess 
 {
-       return Carp::shortmess(@_);
+       return dbgtrace(@_);
 }
 
 sub longmess 
 {
-       return Carp::longmess(@_);
+       return dbgtrace(@_);
 }
 
 sub dbgprintring