perl -d:Trace yourscript ... >> lease.log 2>&1 & #### # -*- perl -*- package Devel::Trace; use threads; use threads::shared; use Data::Dump qw[ pp ]; $VERSION = '0.10'; $TRACE = 1; $VARS = 0; # This is the important part. The rest is just fluff. sub DB::DB { local $\; return unless $TRACE; my ($p, $f, $l) = caller; my $code = \@{"::_<$f"}; lock( $::semSTDERR ) if defined $::semSTDERR; printf STDERR ">> [%d] %-30s:%5d: %s", ( threads->self->tid || 'n/a' ), ( $f || 'n/a' ), ( $l || -1 ), ( $code->[$l] || "???\n" ); return unless $VARS; $code->[$l] =~ s/ ( [\$@%] [#]? \w* ) (?: ( (?:->)? (?: [\[{] [^\]}]+ [\]}] )+ ) )? / no warnings 'uninitialized'; my $var = (defined $2 ? "$1$2" : $1 ); eval qq[ printf "\$var := %s\n", do{ package $p; $var }; ]; $1 . ( $2 || '' ) /gex; } sub import { my $package = shift; foreach (@_) { if ($_ eq 'trace') { my $caller = caller; *{$caller . '::trace'} = \&{$package . '::trace'}; } else { use Carp; croak "Package $package does not export `$_'; aborting"; } } } my %tracearg = ('on' => 1, 'off' => 0); sub trace { my $arg = shift; $arg = $tracearg{$arg} while exists $tracearg{$arg}; $TRACE = $arg; } 1;