diff --git a/runtime/j9vm/j7vmi.c b/runtime/j9vm/j7vmi.c index 8c3a09732f9..2a9a69045ba 100644 --- a/runtime/j9vm/j7vmi.c +++ b/runtime/j9vm/j7vmi.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2021 IBM Corp. and others + * Copyright (c) 2002, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -441,6 +441,10 @@ JVM_FillInStackTrace(JNIEnv* env, jobject throwable) flags |= J9_STACKWALK_HIDE_EXCEPTION_FRAMES; walkState->restartException = unwrappedThrowable; } + /* If -XX:+ShowHiddenFrames option has not been set, skip hidden method frames */ + if (J9_ARE_NO_BITS_SET(javaVM->runtimeFlags, J9_RUNTIME_SHOW_HIDDEN_FRAMES)) { + flags |= J9_STACKWALK_SKIP_HIDDEN_FRAMES; + } walkState->skipCount = 1; /* skip the INL frame -- TODO revisit this */ #if JAVA_SPEC_VERSION >= 15 { diff --git a/runtime/jcl/common/getstacktrace.c b/runtime/jcl/common/getstacktrace.c index 24350dfdf72..4bba5b9d6b9 100644 --- a/runtime/jcl/common/getstacktrace.c +++ b/runtime/jcl/common/getstacktrace.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 1998, 2017 IBM Corp. and others + * Copyright (c) 1998, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -49,6 +49,10 @@ getStackTraceForThread(J9VMThread *currentThread, J9VMThread *targetThread, UDAT /* walk stack and cache PCs */ walkState.walkThread = targetThread; walkState.flags = J9_STACKWALK_CACHE_PCS | J9_STACKWALK_WALK_TRANSLATE_PC | J9_STACKWALK_SKIP_INLINES | J9_STACKWALK_INCLUDE_NATIVES | J9_STACKWALK_VISIBLE_ONLY; + /* If -XX:+ShowHiddenFrames option has not been set, skip hidden method frames */ + if (J9_ARE_NO_BITS_SET(vm->runtimeFlags, J9_RUNTIME_SHOW_HIDDEN_FRAMES)) { + walkState.flags |= J9_STACKWALK_SKIP_HIDDEN_FRAMES; + } walkState.skipCount = skipCount; rc = vm->walkStackFrames(currentThread, &walkState); diff --git a/runtime/jcl/common/java_lang_StackWalker.cpp b/runtime/jcl/common/java_lang_StackWalker.cpp index b92bc94ddde..dc4f5eda9e8 100644 --- a/runtime/jcl/common/java_lang_StackWalker.cpp +++ b/runtime/jcl/common/java_lang_StackWalker.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2021 IBM Corp. and others + * Copyright (c) 2017, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -67,9 +67,6 @@ stackFrameFilter(J9VMThread * currentThread, J9StackWalkState * walkState) ) { /* skip reflection/MethodHandleInvoke frames */ result = J9_STACKWALK_KEEP_ITERATING; - } else if (J9_ARE_NO_BITS_SET((UDATA) (walkState->userData1), SHOW_HIDDEN_FRAMES) && VM_VMHelpers::isHiddenMethod(walkState->method) - ) { - result = J9_STACKWALK_KEEP_ITERATING; } else { result = J9_STACKWALK_STOP_ITERATING; } @@ -93,6 +90,12 @@ Java_java_lang_StackWalker_walkWrapperImpl(JNIEnv *env, jclass clazz, jint flags walkState->walkThread = vmThread; walkState->flags = J9_STACKWALK_ITERATE_FRAMES | J9_STACKWALK_WALK_TRANSLATE_PC | J9_STACKWALK_INCLUDE_NATIVES | J9_STACKWALK_VISIBLE_ONLY; + /* If -XX:+ShowHiddenFrames and StackWalker.SHOW_HIDDEN_FRAMES option has not been set, skip hidden method frames */ + if (J9_ARE_NO_BITS_SET(vm->runtimeFlags, J9_RUNTIME_SHOW_HIDDEN_FRAMES) + && J9_ARE_NO_BITS_SET((UDATA)flags, SHOW_HIDDEN_FRAMES) + ) { + walkState->flags |= J9_STACKWALK_SKIP_HIDDEN_FRAMES; + } walkState->frameWalkFunction = stackFrameFilter; const char * walkerMethodChars = env->GetStringUTFChars(stackWalkerMethod, NULL); if (NULL == walkerMethodChars) { /* native out of memory exception pending */ diff --git a/runtime/oti/j9consts.h b/runtime/oti/j9consts.h index 5e4c5bfb679..d6ad386a200 100644 --- a/runtime/oti/j9consts.h +++ b/runtime/oti/j9consts.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 1991, 2021 IBM Corp. and others + * Copyright (c) 1991, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -291,7 +291,7 @@ extern "C" { #define J9_RUNTIME_EXIT_STARTED 0x800000 #define J9_RUNTIME_UNUSED_0x1000000 0x1000000 #define J9_RUNTIME_NO_PRIORITIES 0x2000000 -#define J9_RUNTIME_UNUSED_0x4000000 0x4000000 +#define J9_RUNTIME_SHOW_HIDDEN_FRAMES 0x4000000 #define J9_RUNTIME_DISABLE_VM_SHUTDOWN 0x8000000 #define J9_RUNTIME_ALWAYS_SPLIT_BYTECODES 0x10000000 #define J9_RUNTIME_OMIT_STACK_TRACES 0x20000000 @@ -391,6 +391,7 @@ extern "C" { #define J9_STACKWALK_CACHE_CPS 0x200 #define J9_STACKWALK_CACHE_METHODS 0x400 #define J9_STACKWALK_CACHE_MASK 0x700 +#define J9_STACKWALK_SKIP_HIDDEN_FRAMES 0x800 #define J9_STACKWALK_INCLUDE_ARRAYLET_LEAVES 0x10000 #define J9_STACKWALK_LINEAR 0x20000 #define J9_STACKWALK_VISIBLE_ONLY 0x40000 diff --git a/runtime/oti/jvminit.h b/runtime/oti/jvminit.h index f42f6f0abe3..a410515e09c 100644 --- a/runtime/oti/jvminit.h +++ b/runtime/oti/jvminit.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 1991, 2021 IBM Corp. and others + * Copyright (c) 1991, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -313,6 +313,8 @@ enum INIT_STAGE { #define VMOPT_X142BOOSTGCTHRPRIO "-X142BoostGCThrPrio" #define VMOPT_XREALTIME "-Xrealtime" #define VMOPT_XNORTSJ "-Xnortsj" +#define VMOPT_XXNOSHOWHIDDENFRAMES "-XX:-ShowHiddenFrames" +#define VMOPT_XXSHOWHIDDENFRAMES "-XX:+ShowHiddenFrames" #define VMOPT_XXNOSTACKTRACEINTHROWABLE "-XX:-StackTraceInThrowable" #define VMOPT_XXSTACKTRACEINTHROWABLE "-XX:+StackTraceInThrowable" #define VMOPT_XXNOPAGEALIGNDIRECTMEMORY "-XX:-PageAlignDirectMemory" diff --git a/runtime/vm/BytecodeInterpreter.hpp b/runtime/vm/BytecodeInterpreter.hpp index 45fab4a427f..310ea60c3c9 100644 --- a/runtime/vm/BytecodeInterpreter.hpp +++ b/runtime/vm/BytecodeInterpreter.hpp @@ -3025,6 +3025,10 @@ class INTERPRETER_CLASS walkFlags |= J9_STACKWALK_HIDE_EXCEPTION_FRAMES; walkState->restartException = receiver; } + /* If -XX:+ShowHiddenFrames option has not been set, skip hidden method frames */ + if (J9_ARE_NO_BITS_SET(_vm->runtimeFlags, J9_RUNTIME_SHOW_HIDDEN_FRAMES)) { + walkFlags |= J9_STACKWALK_SKIP_HIDDEN_FRAMES; + } walkState->flags = walkFlags; walkState->skipCount = 1; /* skip the INL frame */ #if JAVA_SPEC_VERSION >= 15 diff --git a/runtime/vm/FastJNI_java_lang_Throwable.cpp b/runtime/vm/FastJNI_java_lang_Throwable.cpp index a6c113112cb..97f9034da0f 100644 --- a/runtime/vm/FastJNI_java_lang_Throwable.cpp +++ b/runtime/vm/FastJNI_java_lang_Throwable.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2001, 2020 IBM Corp. and others + * Copyright (c) 2001, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -57,6 +57,10 @@ Fast_java_lang_Throwable_fillInStackTrace(J9VMThread *currentThread, j9object_t walkFlags |= J9_STACKWALK_HIDE_EXCEPTION_FRAMES; walkState->restartException = receiver; } + /* If -XX:+ShowHiddenFrames option has not been set, skip hidden method frames */ + if (J9_ARE_NO_BITS_SET(vm->runtimeFlags, J9_RUNTIME_SHOW_HIDDEN_FRAMES)) { + walkFlags |= J9_STACKWALK_SKIP_HIDDEN_FRAMES; + } walkState->flags = walkFlags; walkState->skipCount = 1; /* skip the INL frame */ #if JAVA_SPEC_VERSION >= 15 diff --git a/runtime/vm/jvminit.c b/runtime/vm/jvminit.c index c0c8da081f9..0299500da81 100644 --- a/runtime/vm/jvminit.c +++ b/runtime/vm/jvminit.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 1991, 2021 IBM Corp. and others + * Copyright (c) 1991, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -3787,6 +3787,14 @@ processVMArgsFromFirstToLast(J9JavaVM * vm) } #endif /* JAVA_SPEC_VERSION >= 18 */ + { + IDATA showHiddenFrames = FIND_AND_CONSUME_ARG(EXACT_MATCH, VMOPT_XXSHOWHIDDENFRAMES, NULL); + IDATA noshowHiddenFrames = FIND_AND_CONSUME_ARG(EXACT_MATCH, VMOPT_XXNOSHOWHIDDENFRAMES, NULL); + if (showHiddenFrames > noshowHiddenFrames) { + vm->runtimeFlags |= J9_RUNTIME_SHOW_HIDDEN_FRAMES; + } + } + return JNI_OK; } diff --git a/runtime/vm/swalk.c b/runtime/vm/swalk.c index e597115eb65..b854f54a8a0 100644 --- a/runtime/vm/swalk.c +++ b/runtime/vm/swalk.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 1991, 2021 IBM Corp. and others + * Copyright (c) 1991, 2022 IBM Corp. and others * * This program and the accompanying materials are made available under * the terms of the Eclipse Public License 2.0 which accompanies this @@ -164,6 +164,7 @@ UDATA walkStackFrames(J9VMThread *currentThread, J9StackWalkState *walkState) if (walkState->flags & J9_STACKWALK_START_AT_JIT_FRAME) swPrintf(walkState, 2, "\tSTART_AT_JIT_FRAME\n"); if (walkState->flags & J9_STACKWALK_CACHE_CPS) swPrintf(walkState, 2, "\tCACHE_CPS\n"); if (walkState->flags & J9_STACKWALK_CACHE_PCS) swPrintf(walkState, 2, "\tCACHE_PCS\n"); + if (walkState->flags & J9_STACKWALK_SKIP_HIDDEN_FRAMES) swPrintf(walkState, 2, "\tSKIP_HIDDEN_FRAME\n"); if (walkState->flags & J9_STACKWALK_COUNT_SPECIFIED) swPrintf(walkState, 2, "\tCOUNT_SPECIFIED\n"); if (walkState->flags & J9_STACKWALK_INCLUDE_ARRAYLET_LEAVES) swPrintf(walkState, 2, "\tINCLUDE_ARRAYLET_LEAVES\n"); if (walkState->flags & J9_STACKWALK_INCLUDE_NATIVES) swPrintf(walkState, 2, "\tINCLUDE_NATIVES\n"); @@ -423,6 +424,15 @@ UDATA walkFrame(J9StackWalkState * walkState) } #endif + /* Process hidden method frames */ + if (J9_ARE_ALL_BITS_SET(walkState->flags, J9_STACKWALK_SKIP_HIDDEN_FRAMES) + && (NULL != walkState->method) + && (J9ROMCLASS_IS_ANON_OR_HIDDEN(J9_CLASS_FROM_METHOD(walkState->method)->romClass) + || J9_ARE_ANY_BITS_SET(J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method)->modifiers, J9AccMethodFrameIteratorSkip) + )) { + return J9_STACKWALK_KEEP_ITERATING; + } + if (walkState->skipCount) { --walkState->skipCount; return J9_STACKWALK_KEEP_ITERATING;