# HG changeset patch # User Mark Wielaard # Date 1255527752 -7200 # Node ID 5cfd9324c1b78e6d8f8049eed4fc426756d3a631 # Parent f734c3dcd1a0407922a67647e5e86c8043c54d75 Enable systemtap JNI tracing. 2009-10-14 Mark Wielaard * configure.ac: When enabling systemtap support check sys/sdt.h and g++ are recent enough to allow probes in class constructors and destructors. * patches/icedtea-systemtap.patch: Enable compiling probes in jni.cpp. Rewrite SetField and SetStaticField macros to use DTRACE_PROBE interface directly instead of generating dtrace implementation calls. Clean up dtrace.hpp. * tapset/hotspot.stp.in: Enable hotspot.monitor_notify. Fix up comments. diff -r f734c3dcd1a0 -r 5cfd9324c1b7 ChangeLog --- a/ChangeLog Wed Mar 17 22:12:42 2010 +0000 +++ b/ChangeLog Wed Oct 14 15:42:32 2009 +0200 @@ -14,6 +14,18 @@ Adding stack markings to the x86 assembly for not using executable stack. +2009-10-14 Mark Wielaard + + * configure.ac: When enabling systemtap support check sys/sdt.h + and g++ are recent enough to allow probes in class constructors + and destructors. + * patches/icedtea-systemtap.patch: Enable compiling probes in + jni.cpp. Rewrite SetField and SetStaticField macros + to use DTRACE_PROBE interface directly instead of generating + dtrace implementation calls. Clean up dtrace.hpp. + * tapset/hotspot.stp.in: Enable hotspot.monitor_notify. Fix up + comments. + 2010-03-17 Andrew John Hughes * NEWS: Update for 1.6.3. diff -r f734c3dcd1a0 -r 5cfd9324c1b7 configure.ac --- a/configure.ac Wed Mar 17 22:12:42 2010 +0000 +++ b/configure.ac Wed Oct 14 15:42:32 2009 +0200 @@ -326,6 +326,43 @@ [SDT_H_FOUND='no'; AC_MSG_ERROR([systemtap support needs sys/sdt.h header])]) + AC_MSG_CHECKING([working sys/sdt.h and g++ support]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +class ProbeClass +{ +private: + int& ref; + const char *name; + +public: + ProbeClass(int& v, const char *n) : ref(v), name(n) + { + DTRACE_PROBE2(_test_, cons, name, ref); + } + + void method(int min) + { + DTRACE_PROBE3(_test_, meth, name, ref, min); + ref -= min; + } + + ~ProbeClass() + { + DTRACE_PROBE2(_test_, dest, name, ref); + } +}; +]], +[[ + int i = 64; + DTRACE_PROBE1(_test_, call, i); + ProbeClass inst = ProbeClass(i, "call"); + inst.method(24); +]])], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([systemtap sdt.h or g++ too old])]) + AC_LANG_RESTORE + AC_MSG_CHECKING([for absolute java home install dir]) AC_ARG_WITH([abs-install-dir], [AS_HELP_STRING([--with-abs-install-dir], diff -r f734c3dcd1a0 -r 5cfd9324c1b7 patches/icedtea-systemtap.patch --- a/patches/icedtea-systemtap.patch Wed Mar 17 22:12:42 2010 +0000 +++ b/patches/icedtea-systemtap.patch Wed Oct 14 15:42:32 2009 +0200 @@ -9,22 +9,33 @@ +CFLAGS += -DDTRACE_ENABLED + +# It doesn't support HAVE_DTRACE_H though. -diff -r 945bf7540697 src/share/vm/prims/jni.cpp ---- openjdk/hotspot/src/share/vm/prims/jni.cpp Thu Jan 22 14:42:01 2009 -0800 -+++ openjdk/hotspot/src/share/vm/prims/jni.cpp Mon Feb 02 13:47:34 2009 +0100 -@@ -22,6 +22,12 @@ - * - */ - -+#ifdef __GNUC__ -+// Unfortunately the gcc c preprocessor doesn't like some of the -+// FP_SELECT defines below, so for now we make sure to disable them. -+#undef DTRACE_ENABLED -+#endif -+ - # include "incls/_precompiled.incl" - # include "incls/_jni.cpp.incl" - +--- openjdk/hotspot/src/share/vm/prims/jni.cpp 2009-10-13 15:34:52.499809508 +0200 ++++ openjdk/hotspot/src/share/vm/prims/jni.cpp 2009-10-13 15:31:26.117823588 +0200 +@@ -1747,10 +1744,7 @@ + JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \ + JNIWrapper("Set" XSTR(Result) "Field"); \ + \ +- HS_DTRACE_PROBE_CDECL_N(hotspot_jni, Set##Result##Field__entry, \ +- ( JNIEnv*, jobject, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \ +- HS_DTRACE_PROBE_N(hotspot_jni, Set##Result##Field__entry, \ +- ( env, obj, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \ ++ FP_SELECT_##Result(DTRACE_PROBE4(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID, value),DTRACE_PROBE3(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID)); \ + \ + oop o = JNIHandles::resolve_non_null(obj); \ + klassOop k = o->klass(); \ +@@ -1924,10 +1918,7 @@ + \ + JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \ + JNIWrapper("SetStatic" XSTR(Result) "Field"); \ +- HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\ +- ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \ +- HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \ +- ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \ ++ FP_SELECT_##Result(DTRACE_PROBE4(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID, value),DTRACE_PROBE3(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID)); \ + \ + JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \ + assert(id->is_static_field_id(), "invalid static field id"); \ +- diff -r 945bf7540697 src/share/vm/utilities/dtrace.hpp --- openjdk/hotspot/src/share/vm/utilities/dtrace.hpp Thu Jan 22 14:42:01 2009 -0800 +++ openjdk/hotspot/src/share/vm/utilities/dtrace.hpp Mon Feb 02 13:47:34 2009 +0100 @@ -52,7 +63,7 @@ #define DTRACE_ONLY(x) #define NOT_DTRACE(x) x -@@ -40,9 +41,15 @@ +@@ -40,9 +41,16 @@ #define DTRACE_PROBE3(a,b,c,d,e) {;} #define DTRACE_PROBE4(a,b,c,d,e,f) {;} #define DTRACE_PROBE5(a,b,c,d,e,f,g) {;} @@ -60,6 +71,7 @@ +#define DTRACE_PROBE7(a,b,c,d,e,f,g,h,i) {;} +#define DTRACE_PROBE8(a,b,c,d,e,f,g,h,i,j) {;} +#define DTRACE_PROBE9(a,b,c,d,e,f,g,h,i,j,k) {;} ++#define DTRACE_PROBE10(a,b,c,d,e,f,g,h,i,j,k,l) {;} #endif @@ -68,30 +80,28 @@ #define HS_DTRACE_PROBE_FN(provider,name)\ __dtrace_##provider##___##name -@@ -50,6 +57,13 @@ +@@ -50,6 +58,11 @@ DTRACE_ONLY(extern "C" void HS_DTRACE_PROBE_FN(provider,name) args) #define HS_DTRACE_PROBE_CDECL_N(provider,name,args) \ DTRACE_ONLY(extern void HS_DTRACE_PROBE_FN(provider,name) args) +#else +// Systemtap dtrace compatible probes on GNU/Linux don't. -+#define HS_DTRACE_PROBE_FN(provider,name) -+ +#define HS_DTRACE_PROBE_DECL_N(provider,name,args) +#define HS_DTRACE_PROBE_CDECL_N(provider,name,args) +#endif /* Dtrace probe declarations */ #define HS_DTRACE_PROBE_DECL(provider,name) \ -@@ -91,6 +105,8 @@ +@@ -88,6 +101,8 @@ + uintptr_t,uintptr_t,uintptr_t)) + + /* Dtrace probe definitions */ ++#if defined(SOLARIS) ++// Solaris dtrace uses actual function calls. #define HS_DTRACE_PROBE_N(provider,name, args) \ DTRACE_ONLY(HS_DTRACE_PROBE_FN(provider,name) args) -+#if defined(SOLARIS) -+// Solaris dtrace uses actual function calls. - #define HS_DTRACE_PROBE(provider,name) HS_DTRACE_PROBE0(provider,name) - #define HS_DTRACE_PROBE0(provider,name)\ - HS_DTRACE_PROBE_N(provider,name,()) -@@ -123,3 +139,27 @@ +@@ -123,3 +138,29 @@ HS_DTRACE_PROBE_N(provider,name,((uintptr_t)a0,(uintptr_t)a1,(uintptr_t)a2,\ (uintptr_t)a3,(uintptr_t)a4,(uintptr_t)a5,(uintptr_t)a6,(uintptr_t)a7,\ (uintptr_t)a8,(uintptr_t)a9)) @@ -118,6 +128,8 @@ + DTRACE_PROBE8(provider,name,a0,a1,a2,a3,a4,a5,a6,a7) +#define HS_DTRACE_PROBE9(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)\ + DTRACE_PROBE9(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8) ++#define HS_DTRACE_PROBE10(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)\ ++ DTRACE_PROBE10(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8) +#endif --- openjdk/hotspot/src/share/vm/runtime/arguments.cpp 2009-03-04 14:39:43.000000000 +0100 +++ openjdk/hotspot/src/share/vm/runtime/arguments.cpp 2009-03-04 22:11:37.000000000 +0100 diff -r f734c3dcd1a0 -r 5cfd9324c1b7 tapset/hotspot.stp.in --- a/tapset/hotspot.stp.in Wed Mar 17 22:12:42 2010 +0000 +++ b/tapset/hotspot.stp.in Wed Oct 14 15:42:32 2009 +0200 @@ -311,12 +311,12 @@ name, thread_id, id, class); } -/* Doesn't resolve atm. - hotspot.monitor_notify (extended probe) +/* hotspot.monitor_notify (extended probe) Triggers when a thread calls Object.notify(). Sets thread_id to the current java thread, id to the unique id for this monitor and class to the class name of the object. Needs -XX:+ExtendedDTraceProbes. + */ probe hotspot.monitor_notify = process("@ABS_CLIENT_LIBJVM_SO@").mark("monitor__notify"), process("@ABS_SERVER_LIBJVM_SO@").mark("monitor__notify") @@ -328,7 +328,6 @@ probestr = sprintf("%s(thread_id=%d,id=0x%x,class='%s')", name, thread_id, id, class); } - */ /* hotspot.monitor_notifyAll (extended probe) Triggers when a thread calls Object.notifyAll(). @@ -369,7 +368,7 @@ name, thread_id, id, class); } -/* hotspot.monitor_contended_enter (extended probe) +/* hotspot.monitor_contended_entered (extended probe) Triggers when a thread acquires a contended monotor (after hotspot.monitor_contended_enter has been triggered on this thread, and the other thread triggered a hotspot.monitor_contended_exit).