Reputation: 36441
I have a system script in perl. I need some equivalent of bash -x to determine what is going wrong with the script. Is there something equivalent?
EDIT: What bash -x does is that it prints each line as it is evaluated. This makes debugging code that is just missing some path variable or file very easy.
Upvotes: 46
Views: 26308
Reputation: 4325
In the Perl debugger (run your program by prefixing perl -d
to it) you can use the t
(trace) command in the interactive debugger to toggle tracing.
After reloading your program (R
) the status of the trace is reset.
Unfortunately tracing can significantly slow down your program, especially if loops are executed many times.
Here is some example output:
...
Digest::HMAC::new(/usr/lib/perl5/vendor_perl/5.18.2/Digest/HMAC.pm:10):
10: my($class, $key, $hasher, $block_size) = @_;
Digest::HMAC::new(/usr/lib/perl5/vendor_perl/5.18.2/Digest/HMAC.pm:11):
11: $block_size ||= 64;
Digest::HMAC::new(/usr/lib/perl5/vendor_perl/5.18.2/Digest/HMAC.pm:12):
12: $key = $hasher->new->add($key)->digest if length($key) > $block_size;
Digest::HMAC::new(/usr/lib/perl5/vendor_perl/5.18.2/Digest/HMAC.pm:14):
14: my $self = bless {}, $class;
Digest::HMAC::new(/usr/lib/perl5/vendor_perl/5.18.2/Digest/HMAC.pm:15):
15: $self->{k_ipad} = $key ^ (chr(0x36) x $block_size);
Digest::HMAC::new(/usr/lib/perl5/vendor_perl/5.18.2/Digest/HMAC.pm:16):
16: $self->{k_opad} = $key ^ (chr(0x5c) x $block_size);
Digest::HMAC::new(/usr/lib/perl5/vendor_perl/5.18.2/Digest/HMAC.pm:17):
17: $self->{hasher} = $hasher->new->add($self->{k_ipad});
Digest::SHA::new(/usr/lib/perl5/5.18.2/x86_64-linux-thread-multi/Digest/SHA.pm:45):
45: my($class, $alg) = @_;
...
Upvotes: 1
Reputation: 31
If you are running a current version of perl you can use Devel::Agent.
perl -d:Agent -MDevel::Agent::EveryThing myscript.pl
Upvotes: 3
Reputation: 118635
The Devel::DumpTrace
module has been available since 2011.
Sample usage:
$ cat demo.pl
# demo.pl
# a demonstration of Devel::DumpTrace
$a = 1;
$b = 3;
$c = 2 * $a + 7 * $b;
@d = ($a, $b, $c + $b);
$ perl -d:DumpTrace demo.pl
>>>>> demo.pl:3: $a:1 = 1;
>>>>> demo.pl:4: $b:3 = 3;
>>>>> demo.pl:5: $c:23 = 2 * $a:1 + 7 * $b:3;
>>>>> demo.pl:6: @d:(1,3,26) = ($a:1, $b:3, $c:23 + $b:3);
Upvotes: 9
Reputation: 15780
Always include these statements in your perl scripts:
use strict;
use warnings;
If you want to debug it, use the -d
switch. And here are the commands: http://www.domainavenue.com/pl-debug.htm
Hope that helps.
Upvotes: 2
Reputation: 52655
You should look at "perl -d" (turn on debugger) or "perl -c" (check your script before executing
Upvotes: 7
Reputation: 64919
Take a look at Devel::Trace
or Devel::ebug
.
Given this program named w.pl
:
#!/usr/bin/perl
use strict;
use warnings;
my $answer = 42;
if ($answer == 6 * 9) {
print "everything is running fine.\n";
} else {
warn "there must be a bug somewhere...\n";
}
You can use Devel::Trace
to watch the execution:
perl -d:Trace w.pl
Which produces the following output:
>> w.pl:6: my $answer = 42;
>> w.pl:8: if ($answer == 6 * 9) {
>> w.pl:11: warn "there must be a bug somewhere...\n";
there must be a bug somewhere...
Upvotes: 49