Šimon Tóth
Šimon Tóth

Reputation: 36441

Is there a way to turn on tracing in perl (equivalent to bash -x)?

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

Answers (6)

U. Windl
U. Windl

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

user17800110
user17800110

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

mob
mob

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

Ruel
Ruel

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

Raghuram
Raghuram

Reputation: 52655

You should look at "perl -d" (turn on debugger) or "perl -c" (check your script before executing

Upvotes: 7

Chas. Owens
Chas. Owens

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

Related Questions