- split configure options into multiple lines for easy of editing
- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a
    systemtap tapset defining "python.function.entry" and
    "python.function.return" to make the markers easy to use (dmalcolm;
    source 5), and an example of using the tapset to the docs (dmalcolm;
    source 6) (rhbz:545179)
			
			
This commit is contained in:
		
							parent
							
								
									d5a5bf3c65
								
							
						
					
					
						commit
						c969609dfe
					
				
							
								
								
									
										17
									
								
								libpython.stp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								libpython.stp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | /* Systemtap tapset to make it easier to trace Python */ | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |    Define python.function.entry/return: | ||||||
|  | */ | ||||||
|  | probe python.function.entry = process("python3").library("LIBRARY_PATH").mark("function__entry") | ||||||
|  | { | ||||||
|  |     filename = user_string($arg1); | ||||||
|  |     funcname = user_string($arg2); | ||||||
|  |     lineno = $arg3; | ||||||
|  | } | ||||||
|  | probe python.function.return = process("python3").("LIBRARY_PATH").mark("function__return") | ||||||
|  | { | ||||||
|  |     filename = user_string($arg1); | ||||||
|  |     funcname = user_string($arg2); | ||||||
|  |     lineno = $arg3; | ||||||
|  | } | ||||||
							
								
								
									
										322
									
								
								python-3.1.1-systemtap.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										322
									
								
								python-3.1.1-systemtap.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,322 @@ | |||||||
|  | diff -up Python-3.1.1/configure.in.systemtap Python-3.1.1/configure.in
 | ||||||
|  | --- Python-3.1.1/configure.in.systemtap	2010-02-12 15:24:34.959845279 -0500
 | ||||||
|  | +++ Python-3.1.1/configure.in	2010-02-12 15:24:34.965845345 -0500
 | ||||||
|  | @@ -2359,6 +2359,38 @@ then
 | ||||||
|  |  fi | ||||||
|  |  AC_MSG_RESULT($with_pymalloc) | ||||||
|  |   | ||||||
|  | +# Check for dtrace support
 | ||||||
|  | +AC_MSG_CHECKING(for --with-dtrace)
 | ||||||
|  | +AC_ARG_WITH(dtrace,
 | ||||||
|  | +            AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
 | ||||||
|  | +
 | ||||||
|  | +if test ! -z "$with_dtrace"
 | ||||||
|  | +then
 | ||||||
|  | +    if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
 | ||||||
|  | +    then
 | ||||||
|  | +	AC_DEFINE(WITH_DTRACE, 1, 
 | ||||||
|  | +	 [Define if you want to compile in Dtrace support])
 | ||||||
|  | +	with_dtrace="Sun"
 | ||||||
|  | +	DTRACEOBJS="Python/dtrace.o"
 | ||||||
|  | +	DTRADEHDRS=""
 | ||||||
|  | +    elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
 | ||||||
|  | +   then
 | ||||||
|  | +	AC_DEFINE(WITH_DTRACE, 1, 
 | ||||||
|  | +	 [Define if you want to compile in Dtrace support])
 | ||||||
|  | +	with_dtrace="Apple"
 | ||||||
|  | +	DTRACEOBJS=""
 | ||||||
|  | +	DTRADEHDRS="pydtrace.h"
 | ||||||
|  | +    else
 | ||||||
|  | +	with_dtrace="no"
 | ||||||
|  | +    fi
 | ||||||
|  | +else
 | ||||||
|  | +    with_dtrace="no"
 | ||||||
|  | +fi
 | ||||||
|  | +
 | ||||||
|  | +AC_MSG_RESULT($with_dtrace)
 | ||||||
|  | +AC_SUBST(DTRACEOBJS)
 | ||||||
|  | +AC_SUBST(DTRACEHDRS)
 | ||||||
|  | +
 | ||||||
|  |  # Check for --with-wctype-functions | ||||||
|  |  AC_MSG_CHECKING(for --with-wctype-functions) | ||||||
|  |  AC_ARG_WITH(wctype-functions,  | ||||||
|  | diff -up Python-3.1.1/Include/pydtrace.d.systemtap Python-3.1.1/Include/pydtrace.d
 | ||||||
|  | --- Python-3.1.1/Include/pydtrace.d.systemtap	2010-02-12 15:24:34.966844913 -0500
 | ||||||
|  | +++ Python-3.1.1/Include/pydtrace.d	2010-02-12 15:24:34.966844913 -0500
 | ||||||
|  | @@ -0,0 +1,10 @@
 | ||||||
|  | +provider python {
 | ||||||
|  | +	probe function__entry(const char *, const char *, int);
 | ||||||
|  | +	probe function__return(const char *, const char *, int);
 | ||||||
|  | +};
 | ||||||
|  | +
 | ||||||
|  | +#pragma D attributes Evolving/Evolving/Common provider python provider
 | ||||||
|  | +#pragma D attributes Private/Private/Common provider python module
 | ||||||
|  | +#pragma D attributes Private/Private/Common provider python function
 | ||||||
|  | +#pragma D attributes Evolving/Evolving/Common provider python name
 | ||||||
|  | +#pragma D attributes Evolving/Evolving/Common provider python args
 | ||||||
|  | diff -up Python-3.1.1/Makefile.pre.in.systemtap Python-3.1.1/Makefile.pre.in
 | ||||||
|  | --- Python-3.1.1/Makefile.pre.in.systemtap	2010-02-12 15:24:34.953845073 -0500
 | ||||||
|  | +++ Python-3.1.1/Makefile.pre.in	2010-02-12 15:24:34.990844336 -0500
 | ||||||
|  | @@ -312,6 +312,7 @@ PYTHON_OBJS=	\
 | ||||||
|  |  		Python/dtoa.o \ | ||||||
|  |  		Python/formatter_unicode.o \ | ||||||
|  |  		Python/$(DYNLOADFILE) \ | ||||||
|  | +		@DTRACEOBJS@ \
 | ||||||
|  |  		$(LIBOBJS) \ | ||||||
|  |  		$(MACHDEP_OBJS) \ | ||||||
|  |  		$(THREADOBJ) | ||||||
|  | @@ -592,6 +593,18 @@ Python/formatter_unicode.o: $(srcdir)/Py
 | ||||||
|  |  				$(srcdir)/Objects/stringlib/formatter.h | ||||||
|  |   | ||||||
|  |   | ||||||
|  | +# Only needed with --with-dtrace
 | ||||||
|  | +buildinclude:
 | ||||||
|  | +	mkdir -p Include
 | ||||||
|  | +
 | ||||||
|  | +Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
 | ||||||
|  | +	dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
 | ||||||
|  | +
 | ||||||
|  | +Python/ceval.o: Include/pydtrace.h
 | ||||||
|  | +
 | ||||||
|  | +Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
 | ||||||
|  | +	dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
 | ||||||
|  | +
 | ||||||
|  |  ############################################################################ | ||||||
|  |  # Header files | ||||||
|  |   | ||||||
|  | @@ -1224,6 +1237,6 @@ Python/thread.o: @THREADHEADERS@
 | ||||||
|  |  .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure | ||||||
|  |  .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools | ||||||
|  |  .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean  | ||||||
|  | -.PHONY: smelly funny patchcheck
 | ||||||
|  | +.PHONY: smelly funny patchcheck buildinclude
 | ||||||
|  |   | ||||||
|  |  # IF YOU PUT ANYTHING HERE IT WILL GO AWAY | ||||||
|  | diff -up Python-3.1.1/pyconfig.h.in.systemtap Python-3.1.1/pyconfig.h.in
 | ||||||
|  | --- Python-3.1.1/pyconfig.h.in.systemtap	2009-05-29 13:25:39.000000000 -0400
 | ||||||
|  | +++ Python-3.1.1/pyconfig.h.in	2010-02-12 15:24:34.991845511 -0500
 | ||||||
|  | @@ -5,6 +5,9 @@
 | ||||||
|  |  #define Py_PYCONFIG_H | ||||||
|  |   | ||||||
|  |   | ||||||
|  | +/* Define if building universal (internal helper macro) */
 | ||||||
|  | +#undef AC_APPLE_UNIVERSAL_BUILD
 | ||||||
|  | +
 | ||||||
|  |  /* Define for AIX if your compiler is a genuine IBM xlC/xlC_r and you want | ||||||
|  |     support for AIX C++ shared extension modules. */ | ||||||
|  |  #undef AIX_GENUINE_CPLUSPLUS | ||||||
|  | @@ -995,6 +998,28 @@
 | ||||||
|  |  /* Define if you want to use computed gotos in ceval.c. */ | ||||||
|  |  #undef USE_COMPUTED_GOTOS | ||||||
|  |   | ||||||
|  | +/* Enable extensions on AIX 3, Interix.  */
 | ||||||
|  | +#ifndef _ALL_SOURCE
 | ||||||
|  | +# undef _ALL_SOURCE
 | ||||||
|  | +#endif
 | ||||||
|  | +/* Enable GNU extensions on systems that have them.  */
 | ||||||
|  | +#ifndef _GNU_SOURCE
 | ||||||
|  | +# undef _GNU_SOURCE
 | ||||||
|  | +#endif
 | ||||||
|  | +/* Enable threading extensions on Solaris.  */
 | ||||||
|  | +#ifndef _POSIX_PTHREAD_SEMANTICS
 | ||||||
|  | +# undef _POSIX_PTHREAD_SEMANTICS
 | ||||||
|  | +#endif
 | ||||||
|  | +/* Enable extensions on HP NonStop.  */
 | ||||||
|  | +#ifndef _TANDEM_SOURCE
 | ||||||
|  | +# undef _TANDEM_SOURCE
 | ||||||
|  | +#endif
 | ||||||
|  | +/* Enable general extensions on Solaris.  */
 | ||||||
|  | +#ifndef __EXTENSIONS__
 | ||||||
|  | +# undef __EXTENSIONS__
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  | +
 | ||||||
|  |  /* Define if a va_list is an array of some kind */ | ||||||
|  |  #undef VA_LIST_IS_ARRAY | ||||||
|  |   | ||||||
|  | @@ -1011,6 +1036,9 @@
 | ||||||
|  |  /* Define if you want documentation strings in extension modules */ | ||||||
|  |  #undef WITH_DOC_STRINGS | ||||||
|  |   | ||||||
|  | +/* Define if you want to compile in Dtrace support */
 | ||||||
|  | +#undef WITH_DTRACE
 | ||||||
|  | +
 | ||||||
|  |  /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic | ||||||
|  |     linker (dyld) instead of the old-style (NextStep) dynamic linker (rld). | ||||||
|  |     Dyld is necessary to support frameworks. */ | ||||||
|  | @@ -1032,20 +1060,21 @@
 | ||||||
|  |  /* Define to profile with the Pentium timestamp counter */ | ||||||
|  |  #undef WITH_TSC | ||||||
|  |   | ||||||
|  | -/* Define to 1 if your processor stores words with the most significant byte
 | ||||||
|  | -   first (like Motorola and SPARC, unlike Intel and VAX). */
 | ||||||
|  | -#undef WORDS_BIGENDIAN
 | ||||||
|  | +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
 | ||||||
|  | +   significant byte first (like Motorola and SPARC, unlike Intel). */
 | ||||||
|  | +#if defined AC_APPLE_UNIVERSAL_BUILD
 | ||||||
|  | +# if defined __BIG_ENDIAN__
 | ||||||
|  | +#  define WORDS_BIGENDIAN 1
 | ||||||
|  | +# endif
 | ||||||
|  | +#else
 | ||||||
|  | +# ifndef WORDS_BIGENDIAN
 | ||||||
|  | +#  undef WORDS_BIGENDIAN
 | ||||||
|  | +# endif
 | ||||||
|  | +#endif
 | ||||||
|  |   | ||||||
|  |  /* Define if arithmetic is subject to x87-style double rounding issue */ | ||||||
|  |  #undef X87_DOUBLE_ROUNDING | ||||||
|  |   | ||||||
|  | -/* Define to 1 if on AIX 3.
 | ||||||
|  | -   System headers sometimes define this.
 | ||||||
|  | -   We just want to avoid a redefinition error message.  */
 | ||||||
|  | -#ifndef _ALL_SOURCE
 | ||||||
|  | -# undef _ALL_SOURCE
 | ||||||
|  | -#endif
 | ||||||
|  | -
 | ||||||
|  |  /* Define on OpenBSD to activate all library features */ | ||||||
|  |  #undef _BSD_SOURCE | ||||||
|  |   | ||||||
|  | @@ -1064,15 +1093,25 @@
 | ||||||
|  |  /* This must be defined on some systems to enable large file support. */ | ||||||
|  |  #undef _LARGEFILE_SOURCE | ||||||
|  |   | ||||||
|  | +/* Define to 1 if on MINIX. */
 | ||||||
|  | +#undef _MINIX
 | ||||||
|  | +
 | ||||||
|  |  /* Define on NetBSD to activate all library features */ | ||||||
|  |  #undef _NETBSD_SOURCE | ||||||
|  |   | ||||||
|  |  /* Define _OSF_SOURCE to get the makedev macro. */ | ||||||
|  |  #undef _OSF_SOURCE | ||||||
|  |   | ||||||
|  | +/* Define to 2 if the system does not provide POSIX.1 features except with
 | ||||||
|  | +   this defined. */
 | ||||||
|  | +#undef _POSIX_1_SOURCE
 | ||||||
|  | +
 | ||||||
|  |  /* Define to activate features from IEEE Stds 1003.1-2001 */ | ||||||
|  |  #undef _POSIX_C_SOURCE | ||||||
|  |   | ||||||
|  | +/* Define to 1 if you need to in order for `stat' and other things to work. */
 | ||||||
|  | +#undef _POSIX_SOURCE
 | ||||||
|  | +
 | ||||||
|  |  /* Define if you have POSIX threads, and your system does not define that. */ | ||||||
|  |  #undef _POSIX_THREADS | ||||||
|  |   | ||||||
|  | @@ -1080,12 +1119,12 @@
 | ||||||
|  |  #undef _REENTRANT | ||||||
|  |   | ||||||
|  |  /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>, | ||||||
|  | -   <pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
 | ||||||
|  | +   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
 | ||||||
|  |     #define below would cause a syntax error. */ | ||||||
|  |  #undef _UINT32_T | ||||||
|  |   | ||||||
|  |  /* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>, | ||||||
|  | -   <pthread.h>, or <semaphore.h> is not used. If the typedef was allowed, the
 | ||||||
|  | +   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
 | ||||||
|  |     #define below would cause a syntax error. */ | ||||||
|  |  #undef _UINT64_T | ||||||
|  |   | ||||||
|  | diff -up Python-3.1.1/Python/ceval.c.systemtap Python-3.1.1/Python/ceval.c
 | ||||||
|  | --- Python-3.1.1/Python/ceval.c.systemtap	2009-05-30 17:41:10.000000000 -0400
 | ||||||
|  | +++ Python-3.1.1/Python/ceval.c	2010-02-12 15:24:54.075844169 -0500
 | ||||||
|  | @@ -19,6 +19,10 @@
 | ||||||
|  |   | ||||||
|  |  #include <ctype.h> | ||||||
|  |   | ||||||
|  | +#ifdef WITH_DTRACE
 | ||||||
|  | +#include "pydtrace.h"
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  |  #ifndef WITH_TSC | ||||||
|  |   | ||||||
|  |  #define READ_TIMESTAMP(var) | ||||||
|  | @@ -655,6 +659,69 @@ PyEval_EvalCode(PyCodeObject *co, PyObje
 | ||||||
|  |  			  NULL, NULL); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +#ifdef WITH_DTRACE
 | ||||||
|  | +struct frame_marker_info
 | ||||||
|  | +{
 | ||||||
|  | +	char *filename;
 | ||||||
|  | +	char *name;
 | ||||||
|  | +	int lineno;
 | ||||||
|  | +
 | ||||||
|  | +	PyObject *utf8_filename;
 | ||||||
|  | +	PyObject *utf8_name;
 | ||||||
|  | +};
 | ||||||
|  | +
 | ||||||
|  | +static void
 | ||||||
|  | +get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
 | ||||||
|  | +{
 | ||||||
|  | +	fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
 | ||||||
|  | +	if (fmi->utf8_filename) {
 | ||||||
|  | +		fmi->filename = PyBytes_AsString(fmi->utf8_filename);
 | ||||||
|  | +	} else {
 | ||||||
|  | +		fmi->filename = NULL;
 | ||||||
|  | +		/* FIXME: clear the exception? */
 | ||||||
|  | +	}
 | ||||||
|  | +
 | ||||||
|  | +	fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
 | ||||||
|  | +	if (fmi->utf8_name) {
 | ||||||
|  | +		fmi->name = PyBytes_AsString(fmi->utf8_name);
 | ||||||
|  | +	} else {
 | ||||||
|  | +		fmi->name = NULL;
 | ||||||
|  | +		/* FIXME: clear the exception? */
 | ||||||
|  | +	}
 | ||||||
|  | +
 | ||||||
|  | +	fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +static void
 | ||||||
|  | +release_frame_marker_info(struct frame_marker_info *fmi)
 | ||||||
|  | +{
 | ||||||
|  | +	Py_XDECREF(fmi->utf8_filename);
 | ||||||
|  | +	Py_XDECREF(fmi->utf8_name);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +static void
 | ||||||
|  | +dtrace_entry(PyFrameObject *f)
 | ||||||
|  | +{
 | ||||||
|  | +	struct frame_marker_info fmi;
 | ||||||
|  | +	get_frame_marker_info(f, &fmi);
 | ||||||
|  | +	PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
 | ||||||
|  | +	release_frame_marker_info(&fmi);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +static void
 | ||||||
|  | +dtrace_return(PyFrameObject *f)
 | ||||||
|  | +{
 | ||||||
|  | +	struct frame_marker_info fmi;
 | ||||||
|  | +	get_frame_marker_info(f, &fmi);
 | ||||||
|  | +	PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
 | ||||||
|  | +	release_frame_marker_info(&fmi);
 | ||||||
|  | +}
 | ||||||
|  | +#else
 | ||||||
|  | +#define	PYTHON_FUNCTION_ENTRY_ENABLED() 0
 | ||||||
|  | +#define	PYTHON_FUNCTION_RETURN_ENABLED() 0
 | ||||||
|  | +#define	dtrace_entry(f)
 | ||||||
|  | +#define	dtrace_return(f)
 | ||||||
|  | +#endif
 | ||||||
|  |   | ||||||
|  |  /* Interpreter main loop */ | ||||||
|  |   | ||||||
|  | @@ -1061,6 +1128,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
 | ||||||
|  |  		} | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +        if (PYTHON_FUNCTION_ENTRY_ENABLED())
 | ||||||
|  | +                dtrace_entry(f);
 | ||||||
|  | +
 | ||||||
|  |  	co = f->f_code; | ||||||
|  |  	names = co->co_names; | ||||||
|  |  	consts = co->co_consts; | ||||||
|  | @@ -2907,6 +2977,8 @@ fast_yield:
 | ||||||
|  |   | ||||||
|  |  	/* pop frame */ | ||||||
|  |  exit_eval_frame: | ||||||
|  | +	if (PYTHON_FUNCTION_RETURN_ENABLED())
 | ||||||
|  | +		dtrace_return(f);
 | ||||||
|  |  	Py_LeaveRecursiveCall(); | ||||||
|  |  	tstate->frame = f->f_back; | ||||||
|  |   | ||||||
							
								
								
									
										79
									
								
								python3.spec
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								python3.spec
									
									
									
									
									
								
							| @ -14,6 +14,8 @@ | |||||||
| 
 | 
 | ||||||
| %global with_gdb_hooks 1 | %global with_gdb_hooks 1 | ||||||
| 
 | 
 | ||||||
|  | %global with_systemtap 1 | ||||||
|  | 
 | ||||||
| # We want to byte-compile the .py files within the packages using the new | # We want to byte-compile the .py files within the packages using the new | ||||||
| # python3 binary. | # python3 binary. | ||||||
| #  | #  | ||||||
| @ -37,7 +39,7 @@ | |||||||
| Summary: Version 3 of the Python programming language aka Python 3000 | Summary: Version 3 of the Python programming language aka Python 3000 | ||||||
| Name: python3 | Name: python3 | ||||||
| Version: %{pybasever}.1 | Version: %{pybasever}.1 | ||||||
| Release: 24%{?dist} | Release: 25%{?dist} | ||||||
| License: Python | License: Python | ||||||
| Group: Development/Languages | Group: Development/Languages | ||||||
| Source: http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2 | Source: http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2 | ||||||
| @ -74,6 +76,15 @@ Source3: macros.pybytecompile | |||||||
| # http://fedorapeople.org/gitweb?p=dmalcolm/public_git/libpython.git;a=snapshot;h=36a517ef7848cbd0b3dcc7371f32e47ac4c87eba;sf=tgz | # http://fedorapeople.org/gitweb?p=dmalcolm/public_git/libpython.git;a=snapshot;h=36a517ef7848cbd0b3dcc7371f32e47ac4c87eba;sf=tgz | ||||||
| Source4: libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz | Source4: libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz | ||||||
| 
 | 
 | ||||||
|  | # Systemtap tapset to make it easier to use the systemtap static probes | ||||||
|  | # (actually a template; LIBRARY_PATH will get fixed up during install) | ||||||
|  | # Written by dmalcolm; not yet sent upstream | ||||||
|  | Source5: libpython.stp | ||||||
|  | 
 | ||||||
|  | # Example systemtap script using the tapset | ||||||
|  | # Written by wcohen, mjw, dmalcolm; not yet sent upstream | ||||||
|  | Source6: systemtap-example.stp | ||||||
|  | 
 | ||||||
| Patch0: python-3.1.1-config.patch | Patch0: python-3.1.1-config.patch | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -112,6 +123,13 @@ Patch6: python-3.1.1-no-static-lib.patch | |||||||
| # Adapted from http://svn.python.org/view?view=rev&revision=77170 | # Adapted from http://svn.python.org/view?view=rev&revision=77170 | ||||||
| Patch7: python-3.1.1-with-system-expat.patch | Patch7: python-3.1.1-with-system-expat.patch | ||||||
| 
 | 
 | ||||||
|  | # Systemtap support: add statically-defined probe points | ||||||
|  | # Patch based on upstream bug: http://bugs.python.org/issue4111 | ||||||
|  | # fixed up by mjw and wcohen for 2.6.2, then fixed up by dmalcolm for 2.6.4 | ||||||
|  | # then rewritten by mjw (attachment 390110 of rhbz 545179); ported to 3.1.1 by | ||||||
|  | # dmalcolm | ||||||
|  | Patch8: python-3.1.1-systemtap.patch | ||||||
|  | 
 | ||||||
| Patch102: python-3.1.1-lib64.patch | Patch102: python-3.1.1-lib64.patch | ||||||
| 
 | 
 | ||||||
| # http://bugs.python.org/issue6999 -- fixed in r75062 | # http://bugs.python.org/issue6999 -- fixed in r75062 | ||||||
| @ -128,6 +146,11 @@ BuildRequires: autoconf | |||||||
| BuildRequires: db4-devel >= 4.7 | BuildRequires: db4-devel >= 4.7 | ||||||
| BuildRequires: libffi-devel | BuildRequires: libffi-devel | ||||||
| 
 | 
 | ||||||
|  | %if 0%{?with_systemtap} | ||||||
|  | BuildRequires: systemtap-sdt-devel | ||||||
|  | %global tapsetdir      /usr/share/systemtap/tapset | ||||||
|  | %endif | ||||||
|  | 
 | ||||||
| URL: http://www.python.org/ | URL: http://www.python.org/ | ||||||
| 
 | 
 | ||||||
| # See notes in bug 532118: | # See notes in bug 532118: | ||||||
| @ -200,6 +223,11 @@ chmod +x %{SOURCE1} | |||||||
| %setup -q -n Python-%{version} -T -D -a 4 | %setup -q -n Python-%{version} -T -D -a 4 | ||||||
| %endif # with_gdb_hooks | %endif # with_gdb_hooks | ||||||
| 
 | 
 | ||||||
|  | %if 0%{?with_systemtap} | ||||||
|  | # Provide an example of usage of the tapset: | ||||||
|  | cp -a %{SOURCE6} . | ||||||
|  | %endif # with_systemtap | ||||||
|  | 
 | ||||||
| # Ensure that we're using the system copy of various libraries, rather than | # Ensure that we're using the system copy of various libraries, rather than | ||||||
| # copies shipped by upstream in the tarball: | # copies shipped by upstream in the tarball: | ||||||
| #   Remove embedded copy of expat: | #   Remove embedded copy of expat: | ||||||
| @ -224,6 +252,9 @@ rm -r Modules/zlib || exit 1 | |||||||
| %patch5 -p1 -b .install-tkinter-tests | %patch5 -p1 -b .install-tkinter-tests | ||||||
| %patch6 -p1 -b .no-static-lib | %patch6 -p1 -b .no-static-lib | ||||||
| %patch7 -p1 -b .expat | %patch7 -p1 -b .expat | ||||||
|  | %if 0%{?with_systemtap} | ||||||
|  | %patch8 -p1 -b .systemtap | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %if "%{_lib}" == "lib64" | %if "%{_lib}" == "lib64" | ||||||
| %patch102 -p1 -b .lib64 | %patch102 -p1 -b .lib64 | ||||||
| @ -251,7 +282,21 @@ export CFLAGS="$CFLAGS `pkg-config --cflags openssl`" | |||||||
| export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`" | export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`" | ||||||
| 
 | 
 | ||||||
| autoconf | autoconf | ||||||
| %configure --enable-ipv6 --with-wide-unicode --enable-shared --with-system-ffi --with-system-expat | 
 | ||||||
|  | # For patch 8 (systemtap), we need to get a new header for configure to use: | ||||||
|  | autoheader | ||||||
|  | 
 | ||||||
|  | %configure \ | ||||||
|  |   --enable-ipv6 \ | ||||||
|  |   --with-wide-unicode \ | ||||||
|  |   --enable-shared \ | ||||||
|  | %if 0%{?with_systemtap} | ||||||
|  |   --with-dtrace \ | ||||||
|  |   --with-tapset-install-dir=%{tapsetdir} \ | ||||||
|  | %endif | ||||||
|  |   --with-system-ffi \ | ||||||
|  |   --with-system-expat | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| make OPT="$CFLAGS" %{?_smp_mflags} | make OPT="$CFLAGS" %{?_smp_mflags} | ||||||
| 
 | 
 | ||||||
| @ -397,6 +442,25 @@ mkdir -p %{buildroot}%{_prefix}/lib/debug/%{_libdir} | |||||||
| cp libpython/libpython.py %{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug-gdb.py | cp libpython/libpython.py %{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug-gdb.py | ||||||
| %endif # with_gdb_hooks | %endif # with_gdb_hooks | ||||||
| 
 | 
 | ||||||
|  | # | ||||||
|  | # Systemtap hooks: | ||||||
|  | # | ||||||
|  | %if 0%{?with_systemtap} | ||||||
|  | # Install a tapset for this libpython into tapsetdir, fixing up the path to the | ||||||
|  | # library: | ||||||
|  | mkdir -p %{buildroot}%{tapsetdir} | ||||||
|  | %ifarch ppc64 s390x x86_64 ia64 alpha sparc64 | ||||||
|  | %global libpython_stp libpython%{pybasever}-64.stp | ||||||
|  | %else | ||||||
|  | %global libpython_stp libpython%{pybasever}-32.stp | ||||||
|  | %endif | ||||||
|  | 
 | ||||||
|  | sed \ | ||||||
|  |    -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME}|" \ | ||||||
|  |    %{SOURCE5} \ | ||||||
|  |    > %{buildroot}%{tapsetdir}/%{libpython_stp} | ||||||
|  | %endif # with_systemtap | ||||||
|  | 
 | ||||||
| %check | %check | ||||||
| # Run the upstream test suite, using the "runtests.sh" harness from the upstream | # Run the upstream test suite, using the "runtests.sh" harness from the upstream | ||||||
| # tarball. | # tarball. | ||||||
| @ -583,6 +647,10 @@ rm -fr $RPM_BUILD_ROOT | |||||||
| %files libs | %files libs | ||||||
| %defattr(-,root,root,-) | %defattr(-,root,root,-) | ||||||
| %{_libdir}/%{py_INSTSONAME} | %{_libdir}/%{py_INSTSONAME} | ||||||
|  | %if 0%{?with_systemtap} | ||||||
|  | %{tapsetdir}/%{libpython_stp} | ||||||
|  | %doc systemtap-example.stp | ||||||
|  | %endif | ||||||
| 
 | 
 | ||||||
| %files devel | %files devel | ||||||
| %defattr(-,root,root) | %defattr(-,root,root) | ||||||
| @ -645,6 +713,13 @@ rm -fr $RPM_BUILD_ROOT | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Fri Feb 12 2010 David Malcolm <dmalcolm@redhat.com> - 3.1.1-25 | ||||||
|  | - split configure options into multiple lines for easy of editing | ||||||
|  | - add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap | ||||||
|  | tapset defining "python.function.entry" and "python.function.return" to make | ||||||
|  | the markers easy to use (dmalcolm; source 5), and an example of using the | ||||||
|  | tapset to the docs (dmalcolm; source 6) (rhbz:545179) | ||||||
|  | 
 | ||||||
| * Mon Feb  8 2010 David Malcolm <dmalcolm@redhat.com> - 3.1.1-24 | * Mon Feb  8 2010 David Malcolm <dmalcolm@redhat.com> - 3.1.1-24 | ||||||
| - move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to | - move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to | ||||||
| %%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from | %%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from | ||||||
|  | |||||||
							
								
								
									
										19
									
								
								systemtap-example.stp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								systemtap-example.stp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | /* | ||||||
|  |     Example usage of the Python systemtap tapset to show a nested view of all | ||||||
|  |     Python function calls (and returns) across the whole system. | ||||||
|  | 
 | ||||||
|  |     Run this using | ||||||
|  |         stap systemtap-example.stp | ||||||
|  |     to instrument all Python processes on the system, or (for example) using | ||||||
|  |         stap systemtap-example.stp -c COMMAND | ||||||
|  |     to instrument a specific program (implemented in Python) | ||||||
|  | */ | ||||||
|  | probe python.function.entry | ||||||
|  | { | ||||||
|  |   printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename, lineno); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | probe python.function.return | ||||||
|  | { | ||||||
|  |   printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename, lineno); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user