From 55aa497a9292da29f73b459a5447abdb86b3983e Mon Sep 17 00:00:00 2001 From: Nick Kamal Date: Thu, 21 Nov 2024 15:02:22 -0500 Subject: [PATCH] The changes reflect the feature request #16416. Print the actual string instead of address at max of 32 characters. Subsequent PRs: cmdline option for length (Part 2) and tests (Part 3). Signed-off-by: Nick Kamal --- runtime/rastrace/method_trace.c | 44 ++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/runtime/rastrace/method_trace.c b/runtime/rastrace/method_trace.c index eca88af2ea9..679a7c58cbb 100644 --- a/runtime/rastrace/method_trace.c +++ b/runtime/rastrace/method_trace.c @@ -30,9 +30,6 @@ #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); @@ -477,29 +474,46 @@ traceMethodArgObject(J9VMThread *thr, UDATA* arg0EA, char* cursor, UDATA length) if (object == NULL) { j9str_printf(PORTLIB, cursor, length, "null"); } else { - J9Class* clazz = J9OBJECT_CLAZZ(thr, object); - J9ROMClass * romClass = clazz->romClass; - J9UTF8* className = J9ROMCLASS_CLASSNAME(romClass); + /* string arg */ + J9Class *clazz = J9OBJECT_CLAZZ(thr, object); J9JavaVM *vm = thr->javaVM; if (clazz == J9VMJAVALANGSTRING_OR_NULL(vm)) { - /* string arg */ - char stringArgBuffer[DEFAULT_BUFFER_LENGTH]; - J9InternalVMFunctions const * const vmFuncs = thr->javaVM->internalVMFunctions; - char *stringArgUTF8 = vmFuncs->copyStringToUTF8WithMemAlloc(thr, object, J9_STR_NULL_TERMINATE_RESULT, " ", 2, stringArgBuffer, DEFAULT_BUFFER_LENGTH, NULL); +#define DEFAULT_STRING_LENGTH 32 - if(DEFAULT_STRING_LENGTH < strlen(stringArgUTF8)) { - j9str_printf(PORTLIB, cursor, length, "(String)%.*s...", (U_32)DEFAULT_STRING_LENGTH, J9UTF8_DATA(stringArgUTF8)); + char utf8Buffer[128]; + UDATA utf8Length = 0; + + char *utf8String = vm->internalVMFunctions->copyStringToUTF8WithMemAlloc( + thr, + object, + 0, + "", + 0, + utf8Buffer, + sizeof(utf8Buffer), + &utf8Length); + + if (NULL == utf8String) { + j9str_printf(PORTLIB, cursor, length, "(String)"); + } else if (utf8Length > DEFAULT_STRING_LENGTH) { + j9str_printf(PORTLIB, cursor, length, "(String)\"%.*s\"...", (U_32)DEFAULT_STRING_LENGTH, utf8String); } else { - j9str_printf(PORTLIB, cursor, length, "(String)%.*s", (U_32)J9UTF8_LENGTH(stringArgUTF8), J9UTF8_DATA(stringArgUTF8)); + j9str_printf(PORTLIB, cursor, length, "(String)\"%.*s\"", (U_32)utf8Length, utf8String); } - if ((char*)stringArgBuffer != stringArgUTF8) { - j9mem_free_memory(stringArgUTF8); + if (utf8Buffer != utf8String) { + j9mem_free_memory(utf8String); } + +#undef DEFAULT_STRING_LENGTH + } else { /* TODO: handle arrays */ + + J9ROMClass *romClass = clazz->romClass; + J9UTF8 *className = J9ROMCLASS_CLASSNAME(romClass); j9str_printf(PORTLIB, cursor, length, "%.*s@%p", (U_32)J9UTF8_LENGTH(className), J9UTF8_DATA(className), object); } }