The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Devel::DTrace - Enable dtrace probes for subroutine entry, exit

SYNOPSIS

    $ perl -MDevel::DTrace prog.pl &
    $ ps -af | grep perl
    $ dtrace -p <PID> -s examples/subs-tree.d

    $ cat examples/subs-tree.d
    #pragma D option quiet

    perlxs$target:::sub-entry, perlxs$target:::sub-return {
        printf("%s %s (%s:%d)\n", probename == "sub-entry" ? "->" : "<-",
                copyinstr(arg0), copyinstr(arg1), arg2);
    }

DESCRIPTION

This module is alpha. Use with care. Expect problems. Report bugs.

Sun's dtrace tool is currently supplied with Solaris and Mac OS 10.5. It allows probes to be attached to a running executable so that debug information may be gathered.

This module provides probes for subroutine entry and exit. See examples/subs-tree.d for an small example D script that uses them.

dtperl

When you install Devel::DTrace you will also get a custom Perl interpreter called dtperl which automatically installs the dtrace instrumented runops loop at startup. Any Perl program run under dtperl can be probed using dtrace.

Limitations

Note that dtrace can't find any probes in the Perl executable until after Devel::DTrace has loaded - because before then the probes don't exist. That means that you can't use dtrace to launch the perl executable. Perl must already be running and have loaded Devel::DTrace before you can connect to it with dtrace.

The dtperl interpreter does not have this limitation.

On Solaris dtperl is statically linked and therefore probably not much use. Working out why I can't build a dynamic dtperl is high on my todo list.

Other Notes

It's difficult to test the dtrace probes. To do so the tests would have to run as root and I don't like doing that. So that I can get some test coverage the environment variable DEVEL_DTRACE_RUNOPS_FAKE causes the probes to send output directly to STDOUT rather to dtrace.

Note that this variable is only checked when Devel::DTrace is loaded or dtperl starts up so it can't be used to toggle tracing on and off while a process is running. However you may find it convenient in some cases to

    $ DEVEL_DTRACE_RUNOPS_FAKE=1 dtperl someprog.pl

AUTHOR

Andy Armstrong <andy@hexten.net>

LICENCE AND COPYRIGHT

Copyright (c) 2008, Andy Armstrong <andy@hexten.net>. All rights reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.