From 8bc17609a3f35c3e2e6d1abba6b28ccfe4cc9820 Mon Sep 17 00:00:00 2001 From: Ivan Ristovic Date: Thu, 20 Jan 2022 11:12:59 +0100 Subject: [PATCH] Show module name and version in stacktraces --- .../svm/core/code/FrameInfoQueryResult.java | 29 ++++++++++++++----- .../com/oracle/svm/core/hub/DynamicHub.java | 1 + .../src/com/oracle/svm/hosted/SVMHost.java | 5 +--- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoQueryResult.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoQueryResult.java index d453622a1322..df4de672c006 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoQueryResult.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/FrameInfoQueryResult.java @@ -24,6 +24,7 @@ */ package com.oracle.svm.core.code; +import jdk.internal.loader.BuiltinClassLoader; import org.graalvm.nativeimage.c.function.CodePointer; import com.oracle.svm.core.CalleeSavedRegisters; @@ -39,6 +40,9 @@ import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; +import java.lang.module.ModuleDescriptor; +import java.util.Optional; + public class FrameInfoQueryResult { public enum ValueType { @@ -328,13 +332,24 @@ public int getSourceLineNumber() { * Returns the name and source code location of the method. */ public StackTraceElement getSourceReference() { - /* - * According to StackTraceElement undefined className is denoted by "", undefined fileName - * is denoted by null - */ - final String className = sourceClass != null ? sourceClass.getName() : ""; - String sourceFileName = sourceClass != null ? DynamicHub.fromClass(sourceClass).getSourceFileName() : null; - return new StackTraceElement(className, sourceMethodName, sourceFileName, sourceLineNumber); + if (sourceClass == null) { + return new StackTraceElement("", sourceMethodName, null, sourceLineNumber); + } + + ClassLoader classLoader = sourceClass.getClassLoader(); + String classLoaderName = null; + if (classLoader != null && !(classLoader instanceof BuiltinClassLoader)) { + classLoaderName = classLoader.getName(); + } + Module module = sourceClass.getModule(); + String moduleName = module.getName(); + String moduleVersion = Optional.ofNullable(module.getDescriptor()) + .flatMap(ModuleDescriptor::version) + .map(ModuleDescriptor.Version::toString) + .orElse(null); + String className = sourceClass.getName(); + String sourceFileName = DynamicHub.fromClass(sourceClass).getSourceFileName(); + return new StackTraceElement(classLoaderName, moduleName, moduleVersion, className, sourceMethodName, sourceFileName, sourceLineNumber); } public boolean isNativeMethod() { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java index 8be30c58f1a3..44db4be495a4 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java @@ -306,6 +306,7 @@ public final class DynamicHub implements JavaKind.FormatWithToString, AnnotatedE @Platforms(Platform.HOSTED_ONLY.class) public void setModule(Module module) { + assert module != null; this.module = module; } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java index bc444ff56b99..7f875b7df427 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java @@ -61,7 +61,6 @@ import org.graalvm.compiler.phases.OptimisticOptimizations; import org.graalvm.compiler.phases.common.BoxNodeIdentityPhase; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.serviceprovider.JavaVersionUtil; import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -391,9 +390,7 @@ private DynamicHub createHub(AnalysisType type) { isLocalClass(javaClass), isAnonymousClass(javaClass), superHub, componentHub, sourceFileName, modifiers, hubClassLoader, isHidden, isRecord, nestHost, assertionStatus, type.hasDefaultMethods(), type.declaresDefaultMethods(), isSealed); - if (JavaVersionUtil.JAVA_SPEC > 8) { - ModuleAccess.extractAndSetModule(dynamicHub, javaClass); - } + ModuleAccess.extractAndSetModule(dynamicHub, javaClass); return dynamicHub; }