]> sourceware.org Git - systemtap.git/commitdiff
PR21020: reorganize data passing abi for java method parameters
authorFrank Ch. Eigler <fche@redhat.com>
Fri, 6 Jan 2017 22:37:37 +0000 (17:37 -0500)
committerFrank Ch. Eigler <fche@redhat.com>
Fri, 6 Jan 2017 22:42:38 +0000 (17:42 -0500)
Under a new ABI, all java object types are supported for passing to
java-method probes, by converting them all within the JVM to strings.
The systemtap script side now gets $argX being all utf-char-pointers,
which are loaded into script-side string variables with synthetic
user_string_warn() function calls.

A backward compatibility ABI is preserved in the java helper class
as well as the translator, under --compatible=3.0.

The java testsuite is drastically simplified (and execution time
shortened) to one class.  These now test string and object passing
too, with it and stapbm extended to be able to locate the HelperSDT
jar / .so files within the systemtap installation $prefix.  This way,
the system /usr/lib/jvm/.... path does not need to be populated just
for stap tests to run.  (We should sometime extend the tests to cover
all the argument arities, but eyeballing looks OK for now.)

12 files changed:
NEWS
java/HelperSDT.c
java/org/systemtap/byteman/helper/HelperSDT.java
java/stapbm.in
man/stapprobes.3stap
tapset-method.cxx
testsuite/systemtap.apps/java.exp
testsuite/systemtap.apps/java_backtrace.stp [deleted file]
testsuite/systemtap.apps/multiparams.java
testsuite/systemtap.apps/multiparams.stp
testsuite/systemtap.apps/singleparam.java [deleted file]
testsuite/systemtap.apps/singleparam.stp [deleted file]

diff --git a/NEWS b/NEWS
index 70bcfe942609c141bb69b41ce771304ff13691d9..707ac52d84778ca4d0243f20ee7d41ef92a4090d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,15 @@
 * What's new in version 3.1, PRERELEASE
 
+- Java method probes now convert all types of java parameters to
+  strings using the java toString() method before passing them to
+  systemtap probes; new argN variables copy them into string
+  variables.  Previously, only numeric types were passed, and only by
+  casting to integers.  The previous behaviour is available with
+  --compatible=3.0 .
+
+  3.1:  probe java(...).class(...).method(...) { printf("%s", arg1) }
+  3.0:  probe java(...).class(...).method(...) { printf("%d", $arg1) }
+
 - An older defensive measure to suppress kernel kprobes optimizations
   since the 3.x era has been disabled for recent kernels.  This improves
   the performance of kernel function probes.  In case of related problems,
index 96e203aa00fbe938e9efd202e9eb62c8d02d26fe..e4d6ca09416034545b63871f90c468a777664bac 100644 (file)
@@ -6,21 +6,28 @@
 #include "stdlib.h"
 #include "string.h"
 
-char* get_java_string(JNIEnv *env, jobject _string)
+
+/* java-stap ABI prior to stap version 3.1: pass some strings, some as cast int64_t values */
+
+
+/* Return strdup'd copy of incoming java string. 
+ * Might return NULL.
+ * Caller must free().
+ */
+static /*const*/ char* get_java_string(JNIEnv *env, jobject _string)
 {
   const char* __string = (*env)->GetStringUTFChars(env, _string, NULL);
-  (*env)->ReleaseStringUTFChars(env, _string, NULL);
-  if(__string != NULL){
-    char* string = strdup(__string);
-    return string;
-  }
-  else {
-    char* string = strdup("");
-    return string;
-  }
+  char *copied_string;
+  if(__string != NULL)
+    copied_string = strdup(__string);
+  else
+    copied_string = NULL;
+  /* NB: release the stringref only after strdup()ing it */
+  (*env)->ReleaseStringUTFChars(env, _string, __string);
+  return copied_string;
 }
 
-int64_t determine_java_type(JNIEnv *env, jobject _arg)
+static int64_t determine_java_type(JNIEnv *env, jobject _arg)
 {
   jclass class_arg = (*env)->GetObjectClass(env, _arg);
   jfieldID fidNumber = 0;
@@ -104,20 +111,10 @@ int64_t determine_java_type(JNIEnv *env, jobject _arg)
     {
       return (int64_t)(*env)->GetDoubleField(env, _arg, fidNumber);
     }
-  fidNumber = (*env)->GetFieldID(env, class_arg, "value", "Ljava/lang/String;");
-  if (NULL == fidNumber)
-    {
-      (*env)->ExceptionClear(env);
-      fidNumber = 0;
-    }
-  else
-    {
-      return (int64_t)(intptr_t)get_java_string(env, _arg);
-    }
-  jmethodID getMsgMeth = (*env)->GetMethodID(env, class_arg, "toString", "()Ljava/lang/String;");
-  jstring obj = (jstring)(*env)->CallObjectMethod(env, class_arg, getMsgMeth);
-  char* toString = get_java_string(env, obj);
-  return (int64_t)(intptr_t)toString;
+
+
+  /* Not a simple numeric scalar.  Map that to 0, else we get a memory leak with get_java_string() or worse. */
+  return (int64_t) 0;
 }
 /*
  * Class:     HelperSDT
@@ -316,6 +313,228 @@ JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP_
   free(rulename);
 }
 
+
+
+/* java-stap ABI stap version 3.1: pass all parameters cast to strings */
+
+
+
+/* Return strdup'd copy of incoming java object's toString() value.
+ * Might return NULL.
+ * Caller must free().
+ */
+static /*const*/ char* get_java_tostring(JNIEnv *env, jobject _obj)
+{
+  jclass class_arg = (*env)->GetObjectClass(env, _obj);
+  jmethodID getMsgMeth = (*env)->GetMethodID(env, class_arg, "toString", "()Ljava/lang/String;");
+  jstring obj = (jstring)(*env)->CallObjectMethod(env, _obj, getMsgMeth);
+  /* (*env)->ExceptionClear(env); ? */
+  return get_java_string(env, obj);
+}
+
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE0
+(JNIEnv *env, jobject obj, jstring _rulename)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  STAP_PROBE1(HelperSDT, method31__0, rulename);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE1
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  STAP_PROBE2(HelperSDT, method31__1, arg1, rulename);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE2
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  STAP_PROBE3(HelperSDT, method31__2, arg1, arg2, rulename);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE3
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  STAP_PROBE4(HelperSDT, method31__3, arg1, arg2, arg3, rulename);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE4
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3, jobject _arg4)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  char* arg4 = get_java_tostring(env,_arg4);
+  STAP_PROBE5(HelperSDT, method31__4, arg1, arg2, arg3, arg4, rulename);
+  free(arg4);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE5
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3, jobject _arg4, jobject _arg5)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  char* arg4 = get_java_tostring(env,_arg4);
+  char* arg5 = get_java_tostring(env,_arg5);
+  STAP_PROBE6(HelperSDT, method31__5, arg1, arg2, arg3, arg4, arg5, rulename);
+  free(arg5);
+  free(arg4);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE6
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3, jobject _arg4, jobject _arg5, jobject _arg6)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  char* arg4 = get_java_tostring(env,_arg4);
+  char* arg5 = get_java_tostring(env,_arg5);
+  char* arg6 = get_java_tostring(env,_arg6);
+  STAP_PROBE7(HelperSDT, method31__6, arg1, arg2, arg3, arg4, arg5, arg6, rulename);
+  free(arg6);
+  free(arg5);
+  free(arg4);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE7
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3, jobject _arg4, jobject _arg5, jobject _arg6, jobject _arg7)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  char* arg4 = get_java_tostring(env,_arg4);
+  char* arg5 = get_java_tostring(env,_arg5);
+  char* arg6 = get_java_tostring(env,_arg6);
+  char* arg7 = get_java_tostring(env,_arg7);
+  STAP_PROBE8(HelperSDT, method31__7, arg1, arg2, arg3, arg4, arg5, arg6, arg7, rulename);
+  free(arg7);
+  free(arg6);
+  free(arg5);
+  free(arg4);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE8
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3, jobject _arg4, jobject _arg5, jobject _arg6, jobject _arg7, jobject _arg8)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  char* arg4 = get_java_tostring(env,_arg4);
+  char* arg5 = get_java_tostring(env,_arg5);
+  char* arg6 = get_java_tostring(env,_arg6);
+  char* arg7 = get_java_tostring(env,_arg7);
+  char* arg8 = get_java_tostring(env,_arg8);
+  STAP_PROBE9(HelperSDT, method31__8, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, rulename);
+  free(arg8);
+  free(arg7);
+  free(arg6);
+  free(arg5);
+  free(arg4);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE9
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3, jobject _arg4, jobject _arg5, jobject _arg6, jobject _arg7, jobject _arg8, jobject _arg9)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  char* arg4 = get_java_tostring(env,_arg4);
+  char* arg5 = get_java_tostring(env,_arg5);
+  char* arg6 = get_java_tostring(env,_arg6);
+  char* arg7 = get_java_tostring(env,_arg7);
+  char* arg8 = get_java_tostring(env,_arg8);
+  char* arg9 = get_java_tostring(env,_arg9);
+  STAP_PROBE10(HelperSDT, method31__9, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, rulename);
+  free(arg9);
+  free(arg8);
+  free(arg7);
+  free(arg6);
+  free(arg5);
+  free(arg4);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+JNIEXPORT void JNICALL Java_org_systemtap_byteman_helper_HelperSDT_METHOD_1STAP31_1PROBE10
+(JNIEnv *env, jobject obj, jstring _rulename, jobject _arg1, jobject _arg2, jobject _arg3, jobject _arg4, jobject _arg5, jobject _arg6, jobject _arg7, jobject _arg8, jobject _arg9, jobject _arg10)
+{
+  const char* rulename = (*env)->GetStringUTFChars(env, _rulename, NULL);
+  char* arg1 = get_java_tostring(env,_arg1);
+  char* arg2 = get_java_tostring(env,_arg2);
+  char* arg3 = get_java_tostring(env,_arg3);
+  char* arg4 = get_java_tostring(env,_arg4);
+  char* arg5 = get_java_tostring(env,_arg5);
+  char* arg6 = get_java_tostring(env,_arg6);
+  char* arg7 = get_java_tostring(env,_arg7);
+  char* arg8 = get_java_tostring(env,_arg8);
+  char* arg9 = get_java_tostring(env,_arg9);
+  char* arg10 = get_java_tostring(env,_arg10);
+  STAP_PROBE11(HelperSDT, method31__10, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, rulename);
+  free(arg10);
+  free(arg9);
+  free(arg8);
+  free(arg7);
+  free(arg6);
+  free(arg5);
+  free(arg4);
+  free(arg3);
+  free(arg2);
+  free(arg1);
+  (*env)->ReleaseStringUTFChars(env, _rulename, rulename);
+}
+
+
+
+/* java-stap ABI: backtrace passing */
+
 /*
  * Class:     HelperSDT
  * Method:    METHOD_STAP_BT
index 2ee1237acbaafb84be1c37f4b1c41b55117f4f1a..25b6240799b1e061430159ec50e9aca008ef12bf 100644 (file)
@@ -28,6 +28,18 @@ public class HelperSDT<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
     public native void METHOD_STAP_PROBE8(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6, T8 arg7, T9 arg8);
     public native void METHOD_STAP_PROBE9(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6, T8 arg7, T9 arg8, T10 arg9);
     public native void METHOD_STAP_PROBE10(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6, T8 arg7, T9 arg8, T10 arg9, T11 arg10);
+    /* systemtap 3.1 java abi */
+    public native void METHOD_STAP31_PROBE0(String rulename);
+    public native void METHOD_STAP31_PROBE1(String rulename, T2 arg1);
+    public native void METHOD_STAP31_PROBE2(String rulename, T2 arg1, T3 arg2);
+    public native void METHOD_STAP31_PROBE3(String rulename, T2 arg1, T3 arg2, T4 arg3);
+    public native void METHOD_STAP31_PROBE4(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4);
+    public native void METHOD_STAP31_PROBE5(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5);
+    public native void METHOD_STAP31_PROBE6(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6);
+    public native void METHOD_STAP31_PROBE7(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6, T8 arg7);
+    public native void METHOD_STAP31_PROBE8(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6, T8 arg7, T9 arg8);
+    public native void METHOD_STAP31_PROBE9(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6, T8 arg7, T9 arg8, T10 arg9);
+    public native void METHOD_STAP31_PROBE10(String rulename, T2 arg1, T3 arg2, T4 arg3, T5 arg4, T6 arg5, T7 arg6, T8 arg7, T9 arg8, T10 arg9, T11 arg10);
     public native void METHOD_STAP_BT(String rulename, String exceptionAsString, int __counter);
     public native void METHOD_BT_DELETE(String rulename);
     static{
index 59e714b2798c4199921436934f4ddc6e0f661a5b..b5323989c7939d09d5f8b76321322a09ac404e9e 100755 (executable)
@@ -17,6 +17,21 @@ if [[ $# -gt 8 || $# -lt 7 ]]; then
 fi
 
 arg_command=$1
+# resolve the overloaded parameter; PR21020
+if [ $arg_command = "install31" ]; then
+    mode=install
+    stap="31"
+elif [ $arg_command = "uninstall31" ]; then
+    mode=uninstall
+    stap="31"
+elif [ $arg_command = "install" ]; then
+    mode=install
+    stap=""
+elif [ $arg_command = "uninstall" ]; then
+    mode=uninstall
+else
+    exit 1
+fi
 arg_jvmpid=$2
 arg_rulename=$3
 arg_class=$4
@@ -75,6 +90,18 @@ pkglibexecdir=@libexecdir@/@PACKAGE@
 pkglibexecdir=`eval echo $pkglibexecdir`
 pkglibexecdir=`eval echo $pkglibexecdir`
 
+HELPERSDT_JAR=${pkglibexecdir}/HelperSDT.jar
+if [ ! -f ${HELPERSDT_JAR} ]; then
+    echo "Missing $HELPERSDT_JAR"
+    exit 1
+fi
+
+
+# The JVM that invokes byteman will get classpath/etc. settings from
+# this shell script to look directly under our $prefix.  However, for
+# the target JVM, the HelperSDT* stuff needs to be installed under
+# that JVM's paths.
+
 num=`ls -1 ${JAVA_HOME}/jre/lib/ext/HelperSDT.jar ${JAVA_HOME}/jre/lib/*/libHelperSDT_*.so 2>/dev/null | wc -l`
 if [ $num -lt 2 ]; then
     echo "Missing HelperSDT JNI class/shared library"
@@ -85,7 +112,7 @@ if [ $num -lt 2 ]; then
     echo "  ln -sf ${pkglibexecdir}/libHelperSDT_"'${arch}'".so ${JAVA_HOME}/jre/lib/"'${arch}'"/"
     echo "done"
     echo "ln -sf ${pkglibexecdir}/HelperSDT.jar ${JAVA_HOME}/jre/lib/ext/"
-    exit 1
+#   exit 1
 fi
 
 flagdir="$SYSTEMTAP_DIR/java"
@@ -142,9 +169,9 @@ else
 # byteman classes directly and avoid -javaagent
 
     if [ "$SYSTEMTAP_VERBOSE" != "0" ]; then
-       echo java -classpath ${BYTEMAN_INSTALL_JAR}:${BYTEMAN_JAR}:${TOOLS_JAR} org.jboss.byteman.agent.install.Install -b -p $bmport $BYTEMAN_INSTALL_OPTS $target_pid
+       echo java -classpath ${BYTEMAN_INSTALL_JAR}:${BYTEMAN_JAR}:${TOOLS_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.install.Install -b -p $bmport $BYTEMAN_INSTALL_OPTS $target_pid
     fi
-    java -classpath ${BYTEMAN_INSTALL_JAR}:${BYTEMAN_JAR}:${TOOLS_JAR} org.jboss.byteman.agent.install.Install -b -p $bmport $BYTEMAN_INSTALL_OPTS $target_pid
+    java -classpath ${BYTEMAN_INSTALL_JAR}:${BYTEMAN_JAR}:${TOOLS_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.install.Install -b -p $bmport $BYTEMAN_INSTALL_OPTS $target_pid
     if [ $? -ne 0 ]; then
         echo "Byteman agent failed to install for java pid $target_pid, port $bmport"
         exit 1
@@ -186,17 +213,18 @@ function echo_bytemanrule()
        echo -n 'DO '
     fi
     case "$arg_argcount" in
-        0) echo -n 'METHOD_STAP_PROBE0("'$arg_rulename'")' ;;
-        1) echo -n 'METHOD_STAP_PROBE1("'$arg_rulename'", $1)' ;;
-        2) echo -n 'METHOD_STAP_PROBE2("'$arg_rulename'", $1, $2)' ;;
-        3) echo -n 'METHOD_STAP_PROBE3("'$arg_rulename'", $1, $2, $3)' ;;
-        4) echo -n 'METHOD_STAP_PROBE4("'$arg_rulename'", $1, $2, $3, $4)' ;;
-        5) echo -n 'METHOD_STAP_PROBE5("'$arg_rulename'", $1, $2, $3, $4, $5)' ;;
-        6) echo -n 'METHOD_STAP_PROBE6("'$arg_rulename'", $1, $2, $3, $4, $5, $6)' ;;
-        7) echo -n 'METHOD_STAP_PROBE7("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7)' ;;
-        8) echo -n 'METHOD_STAP_PROBE8("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7, $8)' ;;
-        9) echo -n 'METHOD_STAP_PROBE9("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7, $8, $9)' ;;
-       10) echo -n 'METHOD_STAP_PROBE10("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10)' ;;
+        # For PR21010, we invoke another java<->stap ABI
+        0) echo -n 'METHOD_STAP'$stap'_PROBE0("'$arg_rulename'")' ;;
+        1) echo -n 'METHOD_STAP'$stap'_PROBE1("'$arg_rulename'", $1)' ;;
+        2) echo -n 'METHOD_STAP'$stap'_PROBE2("'$arg_rulename'", $1, $2)' ;;
+        3) echo -n 'METHOD_STAP'$stap'_PROBE3("'$arg_rulename'", $1, $2, $3)' ;;
+        4) echo -n 'METHOD_STAP'$stap'_PROBE4("'$arg_rulename'", $1, $2, $3, $4)' ;;
+        5) echo -n 'METHOD_STAP'$stap'_PROBE5("'$arg_rulename'", $1, $2, $3, $4, $5)' ;;
+        6) echo -n 'METHOD_STAP'$stap'_PROBE6("'$arg_rulename'", $1, $2, $3, $4, $5, $6)' ;;
+        7) echo -n 'METHOD_STAP'$stap'_PROBE7("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7)' ;;
+        8) echo -n 'METHOD_STAP'$stap'_PROBE8("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7, $8)' ;;
+        9) echo -n 'METHOD_STAP'$stap'_PROBE9("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7, $8, $9)' ;;
+       10) echo -n 'METHOD_STAP'$stap'_PROBE10("'$arg_rulename'", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10)' ;;
         *) echo 'bad arg-count'; exit 1 ;;
     esac
     if [ "$arg_backtrace" == "1" ]; then
@@ -219,14 +247,14 @@ if [ "$SYSTEMTAP_VERBOSE" != "0" ]; then
     cat $btmfile
 fi
 
-if [ $arg_command = "uninstall" ]; then
+if [ $mode = "uninstall" ]; then
     bmcmd=-u
 else
     bmcmd=-l
 fi
 
 if [ "$SYSTEMTAP_VERBOSE" != "0" ]; then
-    echo java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd $btmfile
+    echo java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd $btmfile
 fi
 
-exec java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd $btmfile
+exec java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd $btmfile
index ee2132e93a397c6547cce3f798c6855251076862..f9542a34c20aaf38b324ab65120f604355f03de8 100644 (file)
@@ -1030,7 +1030,26 @@ Context variables defined within java probes include
 .IR $arg1
 through
 .IR $arg10
-(for up to the first 10 arguments of a method), represented as integers or strings.
+(for up to the first 10 arguments of a method), represented as character-pointers
+for the
+.B toString()
+form of each actual argument.
+The
+.IR arg1
+through
+.IR arg10
+script variables provide access to these as ordinary strings, fetched via
+.IR user_string_warn() .
+.PP
+Prior to systemtap version 3.1,
+.IR $arg1
+through
+.IR $arg10
+could contain either integers or character pointers, depending on the types of the
+objects being passed to each particular java method.  This previous behaviour may
+be invoked with the
+.I stap --compatible=3.0
+flag.
 
 .SS PROCFS
 
index fdd16543de468dcbdc0d34dbe82daebba8a986fc..7257c3079aa8b795b12e4522856bf159c52160c4 100644 (file)
@@ -1,5 +1,5 @@
 // Tapset for per-method based probes
-// Copyright (C) 2014 Red Hat Inc.
+// Copyright (C) 2014-2016 Red Hat Inc.
 
 // This file is part of systemtap, and is free software.  You can
 // redistribute it and/or modify it under the terms of the GNU General
@@ -80,42 +80,10 @@ public:
              probe_point * location,
              literal_map_t const & parameters,
              vector <derived_probe *> & finished_results);
-  std::string mark_param(int i);
 
   virtual string name() { return "java builder"; }
 };
 
-std::string
-java_builder::mark_param(int i)
-{
-  switch (i)
-    {
-    case 0:
-      return "method__0";
-    case 1:
-      return "method__1";
-    case 2:
-      return "method__2";
-    case 3:
-      return "method__3";
-    case 4:
-      return "method__4";
-    case 5:
-      return "method__5";
-    case 6:
-      return "method__6";
-    case 7:
-      return "method__7";
-    case 8:
-      return "method__8";
-    case 9:
-      return "method__9";
-    case 10:
-      return "method__10";
-    default:
-      return "*";
-    }
-}
 void
 java_builder::build (systemtap_session & sess,
                     probe * base,
@@ -257,11 +225,14 @@ java_builder::build (systemtap_session & sess,
       derive_probes(sess, new_mark_btd_probe, finished_results);
     }
 
+  // PR21020 - support both java<->stap abis
+  string stap31 = (strverscmp(sess.compatible.c_str(), "3.1") >= 0) ? "31" : "";
+  
   /* The overall flow of control during a probed java method is something like this:
 
      (java) java-method ->
      (java) byteman ->
-     (java) HelperSDT::METHOD_STAP_PROBENN ->
+     (java) HelperSDT::METHOD_STAP*_PROBENN ->
      (JNI) HelperSDT_arch.so ->
      (C) sys/sdt.h marker STAP_PROBEN(hotspot,method__N,...,rulename)
 
@@ -280,13 +251,18 @@ java_builder::build (systemtap_session & sess,
 
   stringstream code;
   code << "probe process(" << literal_string(libhelper) << ")" << ".provider(\"HelperSDT\")"
-       << ".mark(" << literal_string (mark_param(method_params_count)) << ") {" << endl;
+       << ".mark(" << literal_string (string("method")+stap31+"__"+lex_cast(method_params_count)) << ") {" << endl;
 
 
   // Make sure the rule name in the last arg matches this probe
   code << "if (user_string($arg" << (method_params_count+1)
        << ") != " << rule_name << ") next;" << endl;
 
+  // add the implicit user_string_warn()s for conversion
+  if (stap31 == "31")
+    for (int i=0; i<method_params_count; i++)
+      code << "arg" << i+1 << " = user_string_warn($arg" << i+1 << ");" << endl;
+
   code << "}" << endl; // End of probe
 
   probe* new_mark_probe = parse_synthetic_probe (sess, code, tok);
@@ -308,7 +284,7 @@ java_builder::build (systemtap_session & sess,
   begin_code << "probe begin {" << endl;
 
   /* stapbm takes the following arguments:
-     $1 - install/uninstall
+     $1 - install/uninstall {,31}
      $2 - JVM PID/unique name
      $3 - RULE name  <--- identifies this probe uniquely at run time
      $4 - class
@@ -318,7 +294,7 @@ java_builder::build (systemtap_session & sess,
      $8 - backtrace
   */
 
-  string leftbits = string(PKGLIBDIR) + "/stapbm install " +
+  string leftbits = string(PKGLIBDIR) + "/stapbm install"+stap31+" " +
     lex_cast_qstring(has_pid_int ? java_pid_str : _java_proc_class) + " ";
 
   string rightbits = " " + lex_cast_qstring(class_str_val) +
@@ -344,7 +320,7 @@ java_builder::build (systemtap_session & sess,
   stringstream end_code;
   end_code << "probe end, error {" << endl;
 
-  leftbits = string(PKGLIBDIR) + "/stapbm uninstall " +
+  leftbits = string(PKGLIBDIR) + "/stapbm uninstall"+stap31+" " +
     lex_cast_qstring(has_pid_int ? java_pid_str : _java_proc_class) + " ";
   // rightbits are the same as the begin probe
 
index ff3b4ec512cd7ac5018c2939ca07e96cf0ae2f4e..d09bda8c4552b1b659a8cc58b879936e393fa7ea 100644 (file)
@@ -4,113 +4,55 @@ if {[catch { exec which javac } res]} {
     return
 }
 
-set test "singleparam"
-
 if {! [installtest_p]} then { untested $test; return }
 if {! [java_p]} then { untested $test; return }
 
-# Test per method probing
-
-catch { exec javac -d ./ $srcdir/$subdir/singleparam.java } err
-if {$err == "" && [file exists ./singleparam.class]} then { pass "$test compile" } else { fail "$test compile $err" }
-
-spawn stap $srcdir/$subdir/singleparam.stp -c "java singleparam >/dev/null 2>&1"
-set ok 0
-expect {
-    -timeout 40
-    -re {[^\r\n]*42\r\n} { incr ok; exp_continue}
-    -re {[^\r\n]*254775806\r\n} { incr ok; exp_continue }
-    -re {[^\r\n]*3\r\n} { incr ok; exp_continue }
-    -re {[^\r\n]*2345987\r\n} { incr ok; exp_continue }
-    -re {[^\r\n]*10\r\n} { incr ok; exp_continue }
-    -re {[^\r\n]*1\r\n} { incr ok; exp_continue }
-    -re {[^\r\n]*97\r\n} { incr ok; exp_continue }
-    -re {[^\r\n]*14\r\n} { incr ok; exp_continue }
-    timeout { fail "$test (timeout)" }
-}
-
-    if {$ok == 8} then {
-       pass "$test ($ok)"
-    } else {
-       fail "$test ($ok)"
-    }
-catch {close}; catch {wait}
+set test "multiparams"
 
-set test "return"
+verbose -log "javac -d ./ $srcdir/$subdir/multiparams.java"
+catch { exec javac -d ./ $srcdir/$subdir/multiparams.java } err2
+if {$err2 == "" && [file exists ./multiparams.class]} then { pass "$test compile" } else { fail "$test compile $err2" }
 
-catch { exec javac -d ./ $srcdir/$subdir/returnstatement.java } err1
-if {$err1 == "" && [file exists ./returnstatement.class]} then { pass "$test compile" } else { fail "$test compile $err1" }
 
-spawn stap $srcdir/$subdir/returnstatement.stp -c "java returnstatement >/dev/null 2>&1"
-set oka 0
+# spawn stap --vp 00002 $srcdir/$subdir/multiparams.stp -c "java -Djava.library.path=$env(PKGLIBDIR) -classpath $env(PKGLIBDIR)/HelperSDT.jar:. multiparams 2>&1"
+spawn stap $srcdir/$subdir/multiparams.stp -c "java -Djava.library.path=$env(PKGLIBDIR) -classpath $env(PKGLIBDIR)/HelperSDT.jar:. multiparams 2>&1"
+set okb 0
 expect {
-    -timeout 40
-    -re {[^\r\n]*42\ ret\r\n} { incr oka; exp_continue }
-    -re {[^\r\n]*254775806\ ret\r\n} { incr oka; exp_continue }
-    -re {[^\r\n]*3\ ret\r\n} { incr oka; exp_continue }
-    -re {[^\r\n]*2345987\ ret\r\n} { incr oka; exp_continue }
-    -re {[^\r\n]*10\ ret\r\n} { incr oka; exp_continue }
-    -re {[^\r\n]*1\ ret\r\n} { incr oka; exp_continue }
-    -re {[^\r\n]*97\ ret\r\n} { incr oka; exp_continue }
-    -re {[^\r\n]*14\ ret\r\n} { incr oka; exp_continue }
+    -timeout 80
+    -re {java[^\r\n]*just a multiparams hello 14 a true 10 2.71828 3.14159265359 254775806 42\r\n} { incr okb; exp_continue }
+    -re {java.lang.Throwable[^\r\n]*\r\n} { incr okb; exp_continue }
+    -re {multiparams.main[^\r\n]*\r\n} { incr okb; exp_continue }
     timeout { fail "$test unexpected timeout" }
 }
-
-    if {$oka == 8} then {
-       pass "$test ($oka)"
-    } else {
-       fail "$test ($oka)"
-    }
-
+if {$okb} then {
+    pass "$test ($okb)"
+    catch {exec rm ./multiparams.class}
+} else {
+    fail "$test ($okb)"
+}
 catch {close}; catch {wait}
-catch {exec rm ./returnstatement.class}
 
-set test "multiparams"
 
+set test "multiparams 3.0"
+
+verbose -log "javac -d ./ $srcdir/$subdir/multiparams.java"
 catch { exec javac -d ./ $srcdir/$subdir/multiparams.java } err2
 if {$err2 == "" && [file exists ./multiparams.class]} then { pass "$test compile" } else { fail "$test compile $err2" }
 
-spawn stap $srcdir/$subdir/multiparams.stp -c "java multiparams >/dev/null 2>&1"
+spawn stap --compatible=3.0 $srcdir/$subdir/multiparams.stp -c "java -Djava.library.path=$env(PKGLIBDIR) -classpath $env(PKGLIBDIR)/HelperSDT.jar:. multiparams 2>&1"
+# spawn stap --vp 00002 --compatible=3.0 $srcdir/$subdir/multiparams.stp -c "java -Djava.library.path=$env(PKGLIBDIR) -classpath $env(PKGLIBDIR)/HelperSDT.jar:. multiparams 2>&1"
 set okb 0
 expect {
-    -timeout 40
-    -re {[^\r\n]*42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*3\ 254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*2345987\ 3\ 254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*10\ 2345987\ 3\ 254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*1\ 10\ 2345987\ 3\ 254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*97\ 1\ 10\ 2345987\ 3\ 254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*14\ 97\ 1\ 10\ 2345987\ 3\ 254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*14\ 14\ 97\ 1\ 10\ 2345987\ 3\ 254775806\ 42\r\n} { incr okb; exp_continue }
-    -re {[^\r\n]*14\ 14\ 14\ 97\ 1\ 10\ 2345987\ 3\ 254775806\ 42\r\n} { incr okb; exp_continue }
+    -timeout 80
+    -re {java[^\r\n]*0x0 0x0 14 97 1 10 2 3 254775806 42\r\n} { incr okb; exp_continue }
+    -re {java.lang.Throwable[^\r\n]*\r\n} { incr okb; exp_continue }
+    -re {multiparams.main[^\r\n]*\r\n} { incr okb; exp_continue }
     timeout { fail "$test unexpected timeout" }
 }
-    if {$okb == 10} then {
-       pass "$test ($okb)"
-    } else {
-       fail "$test ($okb)"
-    }
-
-catch {close}; catch {wait}
-catch {exec rm ./multiparams.class}
-
-set test "stacktrace"
-
-spawn stap $srcdir/$subdir/java_backtrace.stp -c "java singleparam >/dev/null 2>&1"
-set okc 0
-expect {
-    -timeout 40
-    -re {java.lang.Throwable[^\r\n]*\r\n} { incr okc; exp_continue }
-    -re {singleparam.printMessage[^\r\n]*\r\n} { incr okc; exp_continue }
-    -re {singleparam.main[^\r\n]*\r\n} { incr okc; exp_continue }
-    timeout { fail "$test unexpected timeout" }
+if {$okb} then {
+    pass "$test ($okb)"
+    catch {exec rm ./multiparams.class}
+} else {
+    fail "$test ($okb)"
 }
-    if {$okc == 10} then {
-       pass "$test ($okc)"
-    } else {
-       fail "$test ($okc)"
-    }
-
 catch {close}; catch {wait}
-catch {exec rm ./singleparam.class}
diff --git a/testsuite/systemtap.apps/java_backtrace.stp b/testsuite/systemtap.apps/java_backtrace.stp
deleted file mode 100644 (file)
index 8472082..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env stap
-
-probe java("singleparam").class("singleparam").method("printMessage(short)")
-{
-  print_java_backtrace()
-}
index 3255d1563673faf95a2ec5c246010e8d3b34f35e..84a65ed051905aed8a2888255643583b6f0f17a2 100644 (file)
@@ -1,39 +1,24 @@
 class multiparams
 {
-    public static void printMessage1(int a){}
-    public static void printMessage2(long a, int b){}
-    public static void printMessage3(double a, long b, int c){}
-    public static void printMessage4(float a, double b, long c, int d){}
-    public static void printMessage5(byte a, float b, double c, long d, int e){}
-    public static void printMessage6(boolean a, byte b, float c, double d, long e, int f){}
-    public static void printMessage7(char a, boolean b, byte c, float d, double e, long f, int g){}
-    public static void printMessage8(short a, char b, boolean c, byte d, float e, double f, long g, int h){}
-    public static void printMessage9(short a, short b, char c, boolean d, byte e, float f, double g, long h, int i){}
-    public static void printMessage10(short a, short b, short c, char d, boolean e, byte f, float g, double h, long i, int j){}
-
+    public static void printMessage10(Object a, String b, short c, char d, boolean e, byte f, float g, double h, long i, int j) { }
+    public String toString() { return "just a multiparams"; }
+        
     public static void main(String[] args) throws InterruptedException
     {
-       
+        System.out.println("multiparams test started, waiting");
        Thread.sleep(20000);
+        System.out.println("multiparams test function started");
        final int i = 42;
        final long j = 254775806;
-       final double k = 3.14;
-       final float l = 2345987;
+       final double k = 3.14159265359;
+       final float l = 2.71828f;
        final byte n = 10;
        final boolean o = true;
        final char p = 'a';
        final short q = 14;
-
-       printMessage1(i);
-       printMessage2(j, i);
-       printMessage3(k, j, i);
-       printMessage4(l, k, j, i);
-       printMessage5(n, l, k, j, i);
-       printMessage6(o, n, l, k, j, i);
-       printMessage7(p, o, n, l, k, j, i);
-       printMessage8(q, p, o, n, l, k, j, i);
-       printMessage9(q, q, p, o, n, l, k, j, i);
-       printMessage10(q, q, q, p, o, n, l, k, j, i);
-
+        final String r = "hello";
+        final Object s = new multiparams();
+       printMessage10(s, r, q, p, o, n, l, k, j, i);
+        System.out.println("multiparams test function completed");
     }
 }
index 607c3ea867fd4009143620d7b4e198c595a36936..fce0b732b1c7a50af258d81b79dcc75635c12f27 100644 (file)
@@ -1,49 +1,9 @@
-probe java("multiparams").class("multiparams").method("printMessage1(int)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage2(long, int)")
-{
-  printf("%s %d %d\n", pn(), $arg1, $arg2)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage3(double, long, int)")
-{
-  printf("%s %d %d %d\n", pn(), $arg1, $arg2, $arg3)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage4(float, double, long, int)")
-{
-  printf("%s %d %d %d %d\n", pn(), $arg1, $arg2, $arg3, $arg4)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage5(byte, float, double, long, int)")
-{
-  printf("%s %d %d %d %d %d\n", pn(), $arg1, $arg2, $arg3, $arg4, $arg5)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage6(boolean, byte, float, double, long, int)")
-{
-  printf("%s %d %d %d %d %d %d\n", pn(), $arg1, $arg2, $arg3, $arg4, $arg5, $arg6)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage7(char, boolean, byte, float, double, long, int)")
-{
-  printf("%s %d %d %d %d %d %d %d\n", pn(), $arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage8(short, char, boolean, byte, float, double, long, int)")
-{
-  printf("%s %d %d %d %d %d %d %d %d\n", pn(), $arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage9(short, short, char, boolean, byte, float, double, long, int)")
-{
-  printf("%s %d %d %d %d %d %d %d %d %d\n", pn(), $arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8, $arg9)
-}
-
-probe java("multiparams").class("multiparams").method("printMessage10(short, short, short, char, boolean, byte, float, double, long, int)")
-{
-  printf("%s %d %d %d %d %d %d %d %d %d %d\n", pn(), $arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8, $arg9, $arg10)
+probe java("multiparams").class("multiparams").method("printMessage10(Object, String, short, char, boolean, byte, float, double, long, int)")
+{
+  %( systemtap_v >= "3.1" %?
+     printf("%s %s %s %s %s %s %s %s %s %s %s\n", pn(), arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)
+  %:
+     printf("%s %s %s %d %d %d %d %d %d %d %d\n", pn(), user_string_quoted($arg1), user_string_quoted($arg2), $arg3, $arg4, $arg5, $arg6, $arg7, $arg8, $arg9, $arg10)
+  %)
+  print_java_backtrace()
 }
diff --git a/testsuite/systemtap.apps/singleparam.java b/testsuite/systemtap.apps/singleparam.java
deleted file mode 100644 (file)
index 1aae7ee..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-class singleparam
-{
-    public static void printMessage(int message)
-    {
-       //              System.out.println("int: " + message);
-       final long j = 254775806;
-       printMessage(j);
-    }
-    public static void printMessage(long message)
-    {
-       final double k = 3.14;
-       printMessage(k);
-       //      System.out.println("long: " + message);
-    }
-    public static void printMessage(double message)
-    {
-       final float l = 2345987;
-       printMessage(l);
-       //      System.out.println("double: " + message);
-    }
-    public static void printMessage(float message)
-    {
-       final byte n = 10;
-       printMessage(n);
-       //      System.out.println("float: " + message);
-    }
-    public static void printMessage(byte message)
-    {
-       final boolean o = true;
-       printMessage(o);
-       //      System.out.println("byte: " + message);
-    }
-    public static void printMessage(boolean message)
-    {
-       final char p = 'a';
-       printMessage(p);
-       //      System.out.println("boolean: " + message);
-    }
-    public static void printMessage(char message)
-    {
-       final short q = 14;
-       printMessage(q);
-    }
-    public static void printMessage(short message)
-    {
-       //      System.out.println("short: " + message);
-    }
-
-
-    public static void main(String[] args) throws InterruptedException
-    {
-
-       Thread.sleep(30000);
-       final int i = 42;
-       printMessage(i);
-
-    }
-}
diff --git a/testsuite/systemtap.apps/singleparam.stp b/testsuite/systemtap.apps/singleparam.stp
deleted file mode 100644 (file)
index bb92250..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env stap
-
-probe java("singleparam").class("singleparam").method("printMessage(int)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("singleparam").class("singleparam").method("printMessage(long)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("singleparam").class("singleparam").method("printMessage(double)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("singleparam").class("singleparam").method("printMessage(float)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("singleparam").class("singleparam").method("printMessage(byte)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("singleparam").class("singleparam").method("printMessage(boolean)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("singleparam").class("singleparam").method("printMessage(char)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
-
-probe java("singleparam").class("singleparam").method("printMessage(short)")
-{
-  printf("%s %d\n", pn(), $arg1)
-}
This page took 0.060379 seconds and 5 git commands to generate.