From 2a7753570946dd9741d69745c1240fb9bd114706 Mon Sep 17 00:00:00 2001 From: Nick Kamal Date: Tue, 19 Nov 2024 14:28:35 -0500 Subject: [PATCH] Print actual string arguments with -Xtrace (part 2) The changes reflect the feature request #16416. Adding cmdline option to specify string argument length. -Xtrace:methodstrarglen=[1-128] methodStrArgLen takes an unsigned integer value from 1 to 128 If methodStrArgLen = 0 or unspecified, default to 32. Other invalid inputs result in the input error. There will be subsequent PR for tests (part 3). Signed-off-by: Nick Kamal --- runtime/oti/j9trace.h | 1 + runtime/rastrace/j9rastrace.h | 14 +++++---- runtime/rastrace/method_trace.c | 7 +++++ runtime/rastrace/method_trigger.c | 48 +++++++++++++++++++++++++++++-- runtime/rastrace/trcengine.c | 1 + 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/runtime/oti/j9trace.h b/runtime/oti/j9trace.h index 03fe720b4a0..ec6624c0e00 100644 --- a/runtime/oti/j9trace.h +++ b/runtime/oti/j9trace.h @@ -63,6 +63,7 @@ typedef struct RasGlobalStorage { void * traceMethodTable; int stackdepth; unsigned int stackCompressionLevel; + unsigned int methodStrArgLength; ConfigureTraceFunction configureTraceEngine; #if defined(J9VM_OPT_CRIU_SUPPORT) CRIURestoreInitializeTrace criuRestoreInitializeTrace; diff --git a/runtime/rastrace/j9rastrace.h b/runtime/rastrace/j9rastrace.h index d754ec60f0d..9b1c08e47d8 100644 --- a/runtime/rastrace/j9rastrace.h +++ b/runtime/rastrace/j9rastrace.h @@ -48,12 +48,13 @@ extern "C" { * Keywords for options added by J9VM layer. * ============================================================================= */ -#define RAS_METHODS_KEYWORD "METHODS" -#define RAS_DEBUG_KEYWORD "DEBUG" -#define RAS_TRIGGER_KEYWORD "TRIGGER" -#define RAS_STACKDEPTH_KEYWORD "STACKDEPTH" -#define RAS_SLEEPTIME_KEYWORD "SLEEPTIME" -#define RAS_COMPRESSION_LEVEL_KEYWORD "STACKCOMPRESSIONLEVEL" +#define RAS_METHODS_KEYWORD "METHODS" +#define RAS_DEBUG_KEYWORD "DEBUG" +#define RAS_TRIGGER_KEYWORD "TRIGGER" +#define RAS_STACKDEPTH_KEYWORD "STACKDEPTH" +#define RAS_SLEEPTIME_KEYWORD "SLEEPTIME" +#define RAS_COMPRESSION_LEVEL_KEYWORD "STACKCOMPRESSIONLEVEL" +#define RAS_METHOD_STRING_LENGTH_KEYWORD "METHODSTRARGLEN" /* * ====================================================================== @@ -130,6 +131,7 @@ omr_error_t processTriggerMethodClause(OMR_VMThread *, char *, BOOLEAN atRuntime void doTriggerActionJstacktrace(OMR_VMThread *thr); omr_error_t setStackDepth(J9JavaVM *thr, const char * value, BOOLEAN atRuntime); omr_error_t setStackCompressionLevel(J9JavaVM * vm, const char *str, BOOLEAN atRuntime); +omr_error_t setMethodStrArgLength(J9JavaVM * vm, const char *str, BOOLEAN atRuntime); /* * ============================================================================= diff --git a/runtime/rastrace/method_trace.c b/runtime/rastrace/method_trace.c index 82b3eb207d5..f6be41d288c 100644 --- a/runtime/rastrace/method_trace.c +++ b/runtime/rastrace/method_trace.c @@ -30,6 +30,9 @@ #undef UT_MODULE_UNLOADED #include "ut_mt.h" +#define DEFAULT_BUFFER_LENGTH 128 +#define DEFAULT_STRING_LENGTH 32 + static void hookRAMClassLoad(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData); static void traceMethodArgInt (J9VMThread *thr, UDATA* arg0EA, char* cursor, UDATA length, char* type); static void traceMethodArgDouble (J9VMThread *thr, UDATA* arg0EA, char* cursor, UDATA length); @@ -476,12 +479,16 @@ traceMethodArgObject(J9VMThread *thr, UDATA* arg0EA, char* cursor, UDATA length) } else { J9Class *clazz = J9OBJECT_CLAZZ(thr, object); J9JavaVM *vm = thr->javaVM; + const unsigned int methodStrArgLength = ((RasGlobalStorage *)thr->javaVM->j9rasGlobalStorage)->methodStrArgLength; + unsigned int strArgLength = methodStrArgLength == 0 ? DEFAULT_STRING_LENGTH : methodStrArgLength; if (clazz == J9VMJAVALANGSTRING_OR_NULL(vm)) { /* string argument */ #define DEFAULT_STRING_LENGTH 32 char utf8Buffer[128]; UDATA utf8Length = 0; + const unsigned int methodStrArgLength = ((RasGlobalStorage *)thr->javaVM->j9rasGlobalStorage)->methodStrArgLength; + unsigned int strArgLength = methodStrArgLength == 0 ? DEFAULT_STRING_LENGTH : methodStrArgLength; char *utf8String = vm->internalVMFunctions->copyStringToUTF8WithMemAlloc( thr, diff --git a/runtime/rastrace/method_trigger.c b/runtime/rastrace/method_trigger.c index cccaddde31f..ba815a30cc2 100644 --- a/runtime/rastrace/method_trigger.c +++ b/runtime/rastrace/method_trigger.c @@ -60,7 +60,6 @@ static const StackTraceFormattingFunction stackTraceFormattingFunctions[] = { #define NUM_STACK_TRACE_FORMATTING_FUNCTIONS (sizeof(stackTraceFormattingFunctions) / sizeof(stackTraceFormattingFunctions[0])) - /************************************************************************** * name - rasSetTriggerTrace * description - Called whenever a class is loaded. @@ -547,6 +546,49 @@ decimalString2Int(J9PortLibrary* portLibrary, const char *decString, I_32 signed return num; } +/************************************************************************** + * name - setMethodStrArgLength + * description - Set method string argument length + * parameters - thr, trace options, atRuntime flag + * returns - JNI return code + *************************************************************************/ +omr_error_t +setMethodStrArgLength(J9JavaVM *vm, const char *str, BOOLEAN atRuntime) +{ +#define MAX_STRING_LENGTH 128 + PORT_ACCESS_FROM_JAVAVM(vm); + int value, length; + omr_error_t rc = OMR_ERROR_NONE; + const char *p; + + if (getParmNumber(str) != 1) { + goto err; + } + + p = getPositionalParm(1, str, &length); + + if (length > 3) { + goto err; + } + + value = decimalString2Int(PORTLIB, p, FALSE, &rc); + if (OMR_ERROR_NONE != rc) { + goto err; + } + + if ((0 > value) || + (MAX_STRING_LENGTH < value)) { + goto err; + } + + RAS_GLOBAL_FROM_JAVAVM(methodStrArgLength,vm) = (unsigned int)value; + return OMR_ERROR_NONE; +err: + vaReportJ9VMCommandLineError(PORTLIB, "methodstrarglen takes an unsigned integer value from 1 to %d", MAX_STRING_LENGTH); + return OMR_ERROR_INTERNAL; +#undef MAX_STRING_LENGTH 128 +} + /************************************************************************** * name - addTriggeredMethodSpec * description - Take a user specified method trigger rule (from the @@ -654,12 +696,12 @@ addTriggeredMethodSpec(J9VMThread *thr, const char *ptrMethodSpec, const struct } if (methodRule->entryAction != NULL && methodRule->entryAction->name != NULL - && j9_cmdla_stricmp((char *)methodRule->entryAction->name, "jstacktrace") == 0) { + && j9_cmdla_stricmp((char *)methodRule->entryAction->name, "jstacktrace") == 0) { /* set up the current method spec to be enabled for trace */ setMethod(thr->javaVM, ptrMethodSpec, FALSE); } if (methodRule->exitAction != NULL && methodRule->exitAction->name != NULL - && j9_cmdla_stricmp((char *)methodRule->exitAction->name, "jstacktrace") == 0) { + && j9_cmdla_stricmp((char *)methodRule->exitAction->name, "jstacktrace") == 0) { /* set up the current method spec to be enabled for trace */ setMethod(thr->javaVM, ptrMethodSpec, FALSE); } diff --git a/runtime/rastrace/trcengine.c b/runtime/rastrace/trcengine.c index 2c07f8a11a2..6fae3efeac9 100644 --- a/runtime/rastrace/trcengine.c +++ b/runtime/rastrace/trcengine.c @@ -117,6 +117,7 @@ const struct traceOption TRACE_OPTIONS[] = {RAS_METHODS_KEYWORD, FALSE, setMethod}, {RAS_STACKDEPTH_KEYWORD, TRUE, setStackDepth}, {RAS_COMPRESSION_LEVEL_KEYWORD, TRUE, setStackCompressionLevel}, + {RAS_METHOD_STRING_LENGTH_KEYWORD, FALSE, setMethodStrArgLength}, }; #define NUMBER_OF_TRACE_OPTIONS ( sizeof(TRACE_OPTIONS) / sizeof(struct traceOption))