Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Making Use of Dtrace Probe Points on Linux #11088

Open
p5pRT opened this issue Jan 27, 2011 · 3 comments
Open

Making Use of Dtrace Probe Points on Linux #11088

p5pRT opened this issue Jan 27, 2011 · 3 comments

Comments

@p5pRT
Copy link

p5pRT commented Jan 27, 2011

Migrated from rt.perl.org#82922 (status was 'open')

Searchable as RT82922$

@p5pRT
Copy link
Author

p5pRT commented Jan 27, 2011

From lberk@redhat.com

Created by lberk@redhat.com

In Perl 5.12 dtrace/systemtap probe points have been enabled.
These probe points allow for better diagnostics and tracing of perl
scripts.
My patch includes a tapset that enables systemtap to utilize these probe
points on the linux platform, and an example systemtap script.

Adding these files to the source will allow distibutions to install the
files in their corresponding tapset directory, if they so choose.
Changes were tested on the Fedora build of perl, both on 64 bit and 32
bit
spins with no regressions. Both the tapset and example script worked as
expected.

Inline Patch
diff --git a/perl-example.stp b/perl-example.stp
new file mode 100644
index 0000000..6a77b20
--- /dev/null
+++ b/perl-example.stp
@@ -0,0 +1,19 @@
+/*
+    Example of the perl systemtap tapset shows a nested view of perl
subroutine \+ calls and returns across the whole system\. \+ \+ To run​: \+ stap perl\-example\.stp \(for all perl processes\) \+ For specific perl process​: \+ stap perl\-example\.stp \-c COMMAND \+\*/ \+ \+probe perl\.sub\.call \+\{ \+ printf\("%s => sub​: %s\, filename​: %s\, line​: %d\\n"\, thread\_indent\(1\)\, sub\, filename\, lineno\) \+\} \+ \+probe perl\.sub\.return \+\{ \+ printf\("%s \<= sub​: %s\, filename​: %s\, line​: %d\\n"\, thread\_indent\(\-1\)\, sub\, filename\, lineno\) \+\}
Inline Patch
diff --git a/perl.stp b/perl.stp
new file mode 100755
index 0000000..38122d2
--- /dev/null
+++ b/perl.stp
@@ -0,0 +1,26 @@
+ /*
+   This probe will fire when the perl script enters a subroutine.
+ */
+
+probe perl.sub.call = process("LIBRARY_PATH").mark("sub__entry")
+{
+
+  sub = user_string($arg1)
+  filename = user_string($arg2)
+  lineno = $arg3
+
+}
+
+/*
+   This probe will fire when the return from a subroutine has been
+   hit.
+ */
+
+probe perl.sub.return = process("LIBRARY_PATH").mark("sub__return")
+{
+
+  sub = user_string($arg1)
+  filename = user_string($arg2)
+  lineno = $arg3
+
+}
Perl Info

Flags:
    category=install
    severity=wishlist

This perlbug was built using Perl 5.12.3 in the Fedora build system.
It is being executed now by Perl 5.12.3 - Tue Jan 25 10:43:01 EST 2011.

Site configuration information for perl 5.12.3:

Configured by Red Hat, Inc. at Tue Jan 25 10:43:01 EST 2011.

Summary of my perl5 (revision 5 version 12 subversion 3) configuration:

  Platform:
    osname=linux, osvers=2.6.38-0.rc2.git0.1.fc15.x86_64,
archname=x86_64-linux-thread-multi
    uname='linux fed-raw-64 2.6.38-0.rc2.git0.1.fc15.x86_64 #1 smp sat
jan 22 19:02:39 utc 2011 x86_64 x86_64 x86_64 gnu
+linux '
    config_args='-des -Doptimize=-O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-b
+uffer-size=4 -m64 -mtune=generic -Dccdlflags=-Wl,--enable-new-dtags
-DDEBUGGING=-g -Dversion=5.12.3
+-Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red
Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr
+-Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5
-Dsitearch=/usr/local/lib64/perl5 -Dprivlib=/usr/share/perl5
+-Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5
-Dvendorarch=/usr/lib64/perl5/vendor_perl
+-Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64
/usr/lib64 -Duseshrplib -Dusethreads
+-Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles
-Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow
+-Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n
-Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr
+-Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto
-Ud_endprotoent_r_proto -Ud_setprotoent_r_proto
+-Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing
-pipe -fstack-protector -I/usr/local/include -D_
+LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions
-fstack-protector --param=ssp-buffer-size=4 -m64 -
+mtune=generic',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe
-fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.6.0 20110122 (Red Hat 4.6.0-0.3)',
gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -fstack-protector'
    libpth=/usr/local/lib64 /lib64 /usr/lib64
    libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread
-lc -lgdbm_compat
    perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.12.90'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef,
ccdlflags='-Wl,--enable-new-dtags -Wl,-rpath,/usr/lib64/perl5/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --p
+aram=ssp-buffer-size=4 -m64 -mtune=generic'

Locally applied patches:
Locally applied patches:



@INC for perl 5.12.3:
    /usr/local/lib64/perl5
    /usr/local/share/perl5
    /usr/lib64/perl5/vendor_perl
    /usr/share/perl5/vendor_perl
    /usr/lib64/perl5
    /usr/share/perl5
    .


Environment for perl 5.12.3:
    HOME=/home/lberk
    LANG=en_US.UTF-8
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lber
+k/bin
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Mar 24, 2012

From @jkeenan

On Thu Jan 27 10​:42​:06 2011, lberk@​redhat.com wrote​:

This is a bug report for perl from lberk@​redhat.com,
generated with the help of perlbug 1.39 running under perl 5.12.3.

-----------------------------------------------------------------
[Please describe your issue here]
In Perl 5.12 dtrace/systemtap probe points have been enabled.
These probe points allow for better diagnostics and tracing of perl
scripts.
My patch includes a tapset that enables systemtap to utilize these
probe
points on the linux platform, and an example systemtap script.

Adding these files to the source will allow distibutions to install
the
files in their corresponding tapset directory, if they so choose.
Changes were tested on the Fedora build of perl, both on 64 bit and 32
bit
spins with no regressions. Both the tapset and example script worked
as
expected.

diff --git a/perl-example.stp b/perl-example.stp
new file mode 100644
index 0000000..6a77b20
--- /dev/null
+++ b/perl-example.stp
@​@​ -0,0 +1,19 @​@​
+/*
+ Example of the perl systemtap tapset shows a nested view of perl
subroutine
+ calls and returns across the whole system.
+
+ To run​:
+ stap perl-example.stp (for all perl processes)
+ For specific perl process​:
+ stap perl-example.stp -c COMMAND
+*/
+
+probe perl.sub.call
+{
+ printf("%s => sub​: %s, filename​: %s, line​: %d\n",
thread_indent(1),
sub, filename, lineno)
+}
+
+probe perl.sub.return
+{
+ printf("%s <= sub​: %s, filename​: %s, line​: %d\n",
thread_indent(-1), sub, filename, lineno)
+}
diff --git a/perl.stp b/perl.stp
new file mode 100755
index 0000000..38122d2
--- /dev/null
+++ b/perl.stp
@​@​ -0,0 +1,26 @​@​
+ /*
+ This probe will fire when the perl script enters a subroutine.
+ */
+
+probe perl.sub.call = process("LIBRARY_PATH").mark("sub__entry")
+{
+
+ sub = user_string($arg1)
+ filename = user_string($arg2)
+ lineno = $arg3
+
+}
+
+/*
+ This probe will fire when the return from a subroutine has been
+ hit.
+ */
+
+probe perl.sub.return = process("LIBRARY_PATH").mark("sub__return")
+{
+
+ sub = user_string($arg1)
+ filename = user_string($arg2)
+ lineno = $arg3
+
+}

I suspect that the reason why this RT has not garnered a response in
more than a year is that it proposes a change in documentation by
supplying freestanding files rather than by patching something in the
core distribution's existing POD structure.

Would it be possible to work the above patch into a patch to
./pod/perldtrace.pod?

Thank you very much.
Jim Keenan

@p5pRT
Copy link
Author

p5pRT commented Mar 24, 2012

The RT System itself - Status changed from 'new' to 'open'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants