package yDebug; our $tracefile; $|=1; # or not. You'll need that for piping uncluttered STDOUT and STDERR into a pager. sub import { shift; if (@_) { $tracefile = shift; warn __PACKAGE__.": tracing to '$tracefile'\n"; open my $fh, '>', $tracefile or die "open '$tracefile': $!"; $Devel::Trace::FH = $fh; my $oldfh = select $fh; $| = 1; select $oldfh; } } $Devel::Trace::FORMAT = \&format; @Devel::Trace::ORDER = (0..10,-3,-2,-1); my ($file,$pkg,$sub); sub format { my ($package, $filename, $line, $subroutine, $hasargs, $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash) = @_; ($from, $db_args, $codeline) = @_[-3..-1]; my $ret; if ($filename ne $file) { $ret = "# file $filename\n"; $file = $filename; } if ($package and $package ne $pkg) { $ret .= "# package $package\n"; $pkg = $package; } if ($subroutine) { if($sub ne $subroutine) { $ret .= "# -> $subroutine (". join(', ',@$db_args).")"; $ret .= ' called in '. ($wantarray ? 'LIST' : defined $wantarray ? 'SCALAR' : 'VOID' ) . " context\n"; $sub = $subroutine; } } else { $sub = ''; } $ret .= sprintf "%6s", $line; if ($from) { chomp $codeline; $ret .= " >> $codeline # (@$from[0..2])\n"; } else { $ret .= " >> $codeline"; } $ret .= "-" x 78 . "\n"; $ret; } 1;