3 perldtrace - Perl's support for DTrace
7 # dtrace -Zn 'perl::sub-entry, perl::sub-return { trace(copyinstr(arg0)) }'
8 dtrace: description 'perl::sub-entry, perl::sub-return ' matched 10 probes
10 # perl -E 'sub outer { inner(@_) } sub inner { say shift } outer("hello")'
15 0 75915 Perl_pp_entersub:sub-entry BEGIN
16 0 75915 Perl_pp_entersub:sub-entry import
17 0 75922 Perl_pp_leavesub:sub-return import
18 0 75922 Perl_pp_leavesub:sub-return BEGIN
19 0 75915 Perl_pp_entersub:sub-entry outer
20 0 75915 Perl_pp_entersub:sub-entry inner
21 0 75922 Perl_pp_leavesub:sub-return inner
22 0 75922 Perl_pp_leavesub:sub-return outer
26 DTrace is a framework for comprehensive system- and application-level
27 tracing. Perl is a DTrace I<provider>, meaning it exposes several
28 I<probes> for instrumentation. You can use these in conjunction
29 with kernel-level probes, as well as probes from other providers
30 such as MySQL, in order to diagnose software defects, or even just
31 your application's bottlenecks.
33 Perl must be compiled with the C<-Dusedtrace> option in order to
34 make use of the provided probes. While DTrace aims to have no
35 overhead when its instrumentation is not active, Perl's support
36 itself cannot uphold that guarantee, so it is built without DTrace
37 probes under most systems. One notable exception is that Mac OS X
38 ships a F</usr/bin/perl> with DTrace support enabled.
46 Perl's initial DTrace support was added, providing C<sub-entry> and
51 The C<sub-entry> and C<sub-return> probes gain a fourth argument: the
52 package name of the function.
56 The C<phase-change> probe was added.
60 The C<op-entry> probe was added.
68 =item sub-entry(SUBNAME, FILE, LINE, PACKAGE)
70 Traces the entry of any subroutine. Note that all of the variables
71 refer to the subroutine that is being invoked; there is currently
72 no way to get ahold of any information about the subroutine's
73 I<caller> from a DTrace action.
76 printf("%s::%s entered at %s line %d\n",
77 copyinstr(arg3), copyinstr(arg0), copyinstr(arg1), arg0);
80 =item sub-return(SUBNAME, FILE, LINE, PACKAGE)
82 Traces the exit of any subroutine. Note that all of the variables
83 refer to the subroutine that is returning; there is currently no
84 way to get ahold of any information about the subroutine's I<caller>
88 printf("%s::%s returned at %s line %d\n",
89 copyinstr(arg3), copyinstr(arg0), copyinstr(arg1), arg0);
92 =item phase-change(NEWPHASE, OLDPHASE)
94 Traces changes to Perl's interpreter state. You can internalize this
95 as tracing changes to Perl's C<${^GLOBAL_PHASE}> variable, especially
96 since the values for C<NEWPHASE> and C<OLDPHASE> are the strings that
97 C<${^GLOBAL_PHASE}> reports.
99 :*perl*::phase-change {
100 printf("Phase changed from %s to %s\n",
101 copyinstr(arg1), copyinstr(arg0));
104 =item op-entry(OPNAME)
106 Traces the execution of each opcode in the Perl runloop. This probe
107 is fired before the opcode is executed. When the Perl debugger is
108 enabled, the DTrace probe is fired I<after> the debugger hooks (but
109 still before the opcode itself is executed).
112 printf("About to execute opcode %s\n", copyinstr(arg0));
121 =item Most frequently called functions
123 # dtrace -qZn 'sub-entry { @[strjoin(strjoin(copyinstr(arg3),"::"),copyinstr(arg0))] = count() } END {trunc(@, 10)}'
125 Class::MOP::Attribute::slots 400
128 Class::MOP::Instance::inline_slot_access 451
129 Class::MOP::Class::Immutable::Trait:::around 472
130 Class::MOP::Mixin::AttributeCore::has_initializer 496
131 Class::MOP::Method::Wrapped::__ANON__ 544
132 Class::MOP::Package::_package_stash 737
133 Class::MOP::Class::initialize 1128
134 Class::MOP::get_metaclass_by_name 1204
136 =item Trace function calls
138 # dtrace -qFZn 'sub-entry, sub-return { trace(copyinstr(arg0)) }'
140 0 -> Perl_pp_entersub BEGIN
141 0 <- Perl_pp_leavesub BEGIN
142 0 -> Perl_pp_entersub BEGIN
143 0 -> Perl_pp_entersub import
144 0 <- Perl_pp_leavesub import
145 0 <- Perl_pp_leavesub BEGIN
146 0 -> Perl_pp_entersub BEGIN
147 0 -> Perl_pp_entersub dress
148 0 <- Perl_pp_leavesub dress
149 0 -> Perl_pp_entersub dirty
150 0 <- Perl_pp_leavesub dirty
151 0 -> Perl_pp_entersub whiten
152 0 <- Perl_pp_leavesub whiten
153 0 <- Perl_dounwind BEGIN
155 =item Function calls during interpreter cleanup
157 # dtrace -Zn 'phase-change /copyinstr(arg0) == "END"/ { self->ending = 1 } sub-entry /self->ending/ { trace(copyinstr(arg0)) }'
160 1 77214 Perl_pp_entersub:sub-entry END
161 1 77214 Perl_pp_entersub:sub-entry END
162 1 77214 Perl_pp_entersub:sub-entry cleanup
163 1 77214 Perl_pp_entersub:sub-entry _force_writable
164 1 77214 Perl_pp_entersub:sub-entry _force_writable
166 =item System calls at compile time
168 # dtrace -qZn 'phase-change /copyinstr(arg0) == "START"/ { self->interesting = 1 } phase-change /copyinstr(arg0) == "RUN"/ { self->interesting = 0 } syscall::: /self->interesting/ { @[probefunc] = count() } END { trunc(@, 3) }'
174 =item Perl functions that execute the most opcodes
176 # dtrace -qZn 'sub-entry { self->fqn = strjoin(copyinstr(arg3), strjoin("::", copyinstr(arg0))) } op-entry /self->fqn != ""/ { @[self->fqn] = count() } END { trunc(@, 3) }'
178 warnings::unimport 4589
179 Exporter::Heavy::_rebuild_cache 5039
180 Exporter::import 14578
188 =item DTrace User Guide
190 L<http://download.oracle.com/docs/cd/E19082-01/819-3620/index.html>
192 =item DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD
194 L<http://www.amazon.com/DTrace-Dynamic-Tracing-Solaris-FreeBSD/dp/0132091518/>
202 =item L<Devel::DTrace::Provider>
204 This CPAN module lets you create application-level DTrace probes written in Perl.
210 Shawn M Moore C<sartak@gmail.com>