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:maxstringlength=[1-128]
maxstringlength takes an unsigned integer value from 1 to 128
If maxstringlength = 0 or unspecified, default to address printing.
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 Dec 10, 2024
1 parent 4ee9b77 commit 686f6ce
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 15 deletions.
7 changes: 7 additions & 0 deletions runtime/oti/j9trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,19 @@ typedef struct RasGlobalStorage {
void * traceMethodTable;
int stackdepth;
unsigned int stackCompressionLevel;
unsigned int maxStringLength;
ConfigureTraceFunction configureTraceEngine;
#if defined(J9VM_OPT_CRIU_SUPPORT)
CRIURestoreInitializeTrace criuRestoreInitializeTrace;
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
} RasGlobalStorage;

/*
* Default and maximum values for RasGlobalStorage.maxStringLength.
*/
#define RAS_MAX_STRING_LENGTH_DEFAULT 32
#define RAS_MAX_STRING_LENGTH_LIMIT 128

#define RAS_GLOBAL(x) ((RasGlobalStorage *)thr->javaVM->j9rasGlobalStorage)->x

#define RAS_GLOBAL_FROM_JAVAVM(x,vm) ((RasGlobalStorage *)vm->j9rasGlobalStorage)->x
Expand Down
3 changes: 2 additions & 1 deletion runtime/rasdump/dmpsup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1570,7 +1570,8 @@ J9VMDllMain(J9JavaVM *vm, IDATA stage, void *reserved)
/* RAS init may happen in either dump or trace */
vm->j9rasGlobalStorage = j9mem_allocate_memory(sizeof(RasGlobalStorage), OMRMEM_CATEGORY_VM);
if (vm->j9rasGlobalStorage != NULL) {
memset (vm->j9rasGlobalStorage, '\0', sizeof(RasGlobalStorage));
memset(vm->j9rasGlobalStorage, '\0', sizeof(RasGlobalStorage));
RAS_GLOBAL_FROM_JAVAVM(maxStringLength, vm) = RAS_MAX_STRING_LENGTH_DEFAULT;
}
}
break;
Expand Down
6 changes: 4 additions & 2 deletions runtime/rastrace/j9rastrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ extern "C" {
#define RAS_STACKDEPTH_KEYWORD "STACKDEPTH"
#define RAS_SLEEPTIME_KEYWORD "SLEEPTIME"
#define RAS_COMPRESSION_LEVEL_KEYWORD "STACKCOMPRESSIONLEVEL"
#define RAS_MAX_STRING_LENGTH_KEYWORD "MAXSTRINGLENGTH"

/*
* ======================================================================
Expand Down Expand Up @@ -128,8 +129,9 @@ void rasTriggerMethod(J9VMThread *thr, J9Method *mb, I_32 entry, const TriggerPh
BOOLEAN matchMethod (RasMethodTable * methodTable, J9Method *method);
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 setStackDepth(J9JavaVM *thr, const char *value, BOOLEAN atRuntime);
omr_error_t setStackCompressionLevel(J9JavaVM *vm, const char *str, BOOLEAN atRuntime);
omr_error_t setMaxStringLength(J9JavaVM *vm, const char *str, BOOLEAN atRuntime);

/*
* =============================================================================
Expand Down
13 changes: 7 additions & 6 deletions runtime/rastrace/method_trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,11 +476,13 @@ traceMethodArgObject(J9VMThread *thr, UDATA* arg0EA, char* cursor, UDATA length)
} else {
J9Class *clazz = J9OBJECT_CLAZZ(thr, object);
J9JavaVM *vm = thr->javaVM;
const unsigned int maxStringLength = RAS_GLOBAL_FROM_JAVAVM(maxStringLength, vm);

if (clazz == J9VMJAVALANGSTRING_OR_NULL(vm)) {
if (clazz == J9VMJAVALANGSTRING_OR_NULL(vm)
&& (0 != maxStringLength)
) {
/* string argument */
#define DEFAULT_STRING_LENGTH 32
char utf8Buffer[128];
char utf8Buffer[RAS_MAX_STRING_LENGTH_LIMIT + 1];
UDATA utf8Length = 0;

char *utf8String = vm->internalVMFunctions->copyStringToUTF8WithMemAlloc(
Expand All @@ -495,16 +497,15 @@ traceMethodArgObject(J9VMThread *thr, UDATA* arg0EA, char* cursor, UDATA length)

if (NULL == utf8String) {
j9str_printf(PORTLIB, cursor, length, "(String)<Memory allocation error>");
} else if (utf8Length > DEFAULT_STRING_LENGTH) {
j9str_printf(PORTLIB, cursor, length, "(String)\"%.*s\"...", (U_32)DEFAULT_STRING_LENGTH, utf8String);
} else if (utf8Length > maxStringLength) {
j9str_printf(PORTLIB, cursor, length, "(String)\"%.*s\"...", (U_32)maxStringLength, utf8String);
} else {
j9str_printf(PORTLIB, cursor, length, "(String)\"%.*s\"", (U_32)utf8Length, utf8String);
}

if (utf8Buffer != utf8String) {
j9mem_free_memory(utf8String);
}
#undef DEFAULT_STRING_LENGTH
} else {
/* TODO: handle arrays */

Expand Down
48 changes: 43 additions & 5 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,41 @@ decimalString2Int(J9PortLibrary* portLibrary, const char *decString, I_32 signed
return num;
}

/**************************************************************************
* name - setMaxStringLength
* description - Set max string length for arguments and return values
* parameters - vm, str - trace options, atRuntime flag
* returns - JNI return code
*************************************************************************/
omr_error_t
setMaxStringLength(J9JavaVM *vm, const char *str, BOOLEAN atRuntime)
{
PORT_ACCESS_FROM_JAVAVM(vm);
int value = 0;
int length = 0;
omr_error_t rc = OMR_ERROR_NONE;
const char *param = NULL;

if (1 != getParmNumber(str)) {
goto err;
}

param = getPositionalParm(1, str, &length);

value = decimalString2Int(PORTLIB, param, FALSE, &rc);
if (OMR_ERROR_NONE != rc) {
goto err;
}

if ((0 <= value) && (value <= RAS_MAX_STRING_LENGTH_LIMIT)) {
RAS_GLOBAL_FROM_JAVAVM(maxStringLength, vm) = (unsigned int)value;
return OMR_ERROR_NONE;
}
err:
vaReportJ9VMCommandLineError(PORTLIB, "maxstringlength takes an integer value from 0 to %d", RAS_MAX_STRING_LENGTH_LIMIT);
return OMR_ERROR_INTERNAL;
}

/**************************************************************************
* name - addTriggeredMethodSpec
* description - Take a user specified method trigger rule (from the
Expand Down Expand Up @@ -653,13 +687,17 @@ addTriggeredMethodSpec(J9VMThread *thr, const char *ptrMethodSpec, const struct
ptr->next = methodRule;
}

if (methodRule->entryAction != NULL && methodRule->entryAction->name != NULL
&& j9_cmdla_stricmp((char *)methodRule->entryAction->name, "jstacktrace") == 0) {
if ((NULL != methodRule->entryAction)
&& (NULL != methodRule->entryAction->name)
&& (0 == j9_cmdla_stricmp((char *)methodRule->entryAction->name, "jstacktrace"))
) {
/* 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) {
if ((NULL != methodRule->exitAction)
&& (NULL != methodRule->exitAction->name)
&& (0 == j9_cmdla_stricmp((char *)methodRule->exitAction->name, "jstacktrace"))
) {
/* set up the current method spec to be enabled for trace */
setMethod(thr->javaVM, ptrMethodSpec, FALSE);
}
Expand Down
3 changes: 2 additions & 1 deletion runtime/rastrace/trcengine.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,10 @@ const struct traceOption TRACE_OPTIONS[] =
{RAS_METHODS_KEYWORD, FALSE, setMethod},
{RAS_STACKDEPTH_KEYWORD, TRUE, setStackDepth},
{RAS_COMPRESSION_LEVEL_KEYWORD, TRUE, setStackCompressionLevel},
{RAS_MAX_STRING_LENGTH_KEYWORD, FALSE, setMaxStringLength},
};

#define NUMBER_OF_TRACE_OPTIONS ( sizeof(TRACE_OPTIONS) / sizeof(struct traceOption))
#define NUMBER_OF_TRACE_OPTIONS (sizeof(TRACE_OPTIONS) / sizeof(struct traceOption))

/**
* The list of trigger actions defined by J9VM passed to the
Expand Down

0 comments on commit 686f6ce

Please sign in to comment.