Skip to content

Commit

Permalink
Print actual string arguments with -Xtrace (part 2)
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
h3110n3rv3 committed Nov 28, 2024
1 parent 4ee9b77 commit 2a77535
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 9 deletions.
1 change: 1 addition & 0 deletions runtime/oti/j9trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
14 changes: 8 additions & 6 deletions runtime/rastrace/j9rastrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

/*
* ======================================================================
Expand Down Expand Up @@ -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);

/*
* =============================================================================
Expand Down
7 changes: 7 additions & 0 deletions runtime/rastrace/method_trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand Down
48 changes: 45 additions & 3 deletions runtime/rastrace/method_trigger.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down
1 change: 1 addition & 0 deletions runtime/rastrace/trcengine.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down

0 comments on commit 2a77535

Please sign in to comment.