From e8418972474d41c6cc1985df5c650461ded34313 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Wed, 8 Nov 2023 13:22:33 +0000 Subject: [PATCH] 8319374: JFR: Remove instrumentation for exception events Reviewed-by: mgronlun, alanb --- .../share/classes/java/lang/Error.java | 19 +++- .../share/classes/java/lang/Throwable.java | 26 +++++- .../jdk/internal/event/ErrorThrownEvent.java | 47 ++++++++++ .../event/ExceptionStatisticsEvent.java | 47 ++++++++++ .../internal/event/ExceptionThrownEvent.java | 47 ++++++++++ .../jdk/internal/event}/ThrowableTracer.java | 49 +++++----- .../jdk/jfr/events/ErrorThrownEvent.java | 12 +-- .../jdk/jfr/events/EventConfigurations.java | 2 - .../jfr/events/ExceptionStatisticsEvent.java | 2 + .../jdk/jfr/events/ExceptionThrownEvent.java | 9 +- .../jdk/jfr/internal/MirrorEvents.java | 8 +- .../instrument/ConstructorTracerWriter.java | 87 ------------------ .../instrument/ConstructorWriter.java | 89 ------------------- .../jfr/internal/instrument/JDKEvents.java | 29 ++---- .../jfr/internal/periodic/JDKEventTask.java | 2 +- .../jfr/internal/periodic/JavaEventTask.java | 2 +- .../jfr/internal/periodic/PeriodicEvents.java | 2 +- .../jfr/internal/periodic/UserEventTask.java | 2 +- 18 files changed, 234 insertions(+), 247 deletions(-) create mode 100644 src/java.base/share/classes/jdk/internal/event/ErrorThrownEvent.java create mode 100644 src/java.base/share/classes/jdk/internal/event/ExceptionStatisticsEvent.java create mode 100644 src/java.base/share/classes/jdk/internal/event/ExceptionThrownEvent.java rename src/{jdk.jfr/share/classes/jdk/jfr/internal/instrument => java.base/share/classes/jdk/internal/event}/ThrowableTracer.java (55%) delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorTracerWriter.java delete mode 100644 src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorWriter.java diff --git a/src/java.base/share/classes/java/lang/Error.java b/src/java.base/share/classes/java/lang/Error.java index e45b3f0e9f1..002129c7ce3 100644 --- a/src/java.base/share/classes/java/lang/Error.java +++ b/src/java.base/share/classes/java/lang/Error.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,8 @@ package java.lang; +import jdk.internal.event.ThrowableTracer; + /** * An {@code Error} is a subclass of {@code Throwable} * that indicates serious problems that a reasonable application @@ -53,6 +55,9 @@ public class Error extends Throwable { */ public Error() { super(); + if (Throwable.jfrTracing) { + ThrowableTracer.traceError(getClass(), null); + } } /** @@ -65,6 +70,9 @@ public class Error extends Throwable { */ public Error(String message) { super(message); + if (Throwable.jfrTracing) { + ThrowableTracer.traceError(getClass(), message); + } } /** @@ -83,6 +91,9 @@ public class Error extends Throwable { */ public Error(String message, Throwable cause) { super(message, cause); + if (Throwable.jfrTracing) { + ThrowableTracer.traceError(getClass(), message); + } } /** @@ -100,6 +111,9 @@ public class Error extends Throwable { */ public Error(Throwable cause) { super(cause); + if (Throwable.jfrTracing) { + ThrowableTracer.traceError(getClass(), null); + } } /** @@ -121,5 +135,8 @@ public class Error extends Throwable { boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); + if (Throwable.jfrTracing) { + ThrowableTracer.traceError(getClass(), message); + } } } diff --git a/src/java.base/share/classes/java/lang/Throwable.java b/src/java.base/share/classes/java/lang/Throwable.java index 493b9b7c59e..1cd1a107a89 100644 --- a/src/java.base/share/classes/java/lang/Throwable.java +++ b/src/java.base/share/classes/java/lang/Throwable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ package java.lang; import java.io.*; import java.util.*; import jdk.internal.access.SharedSecrets; +import jdk.internal.event.ThrowableTracer; import jdk.internal.misc.InternalLock; /** @@ -118,6 +119,11 @@ public class Throwable implements Serializable { @java.io.Serial private static final long serialVersionUID = -3042686055658047285L; + /** + * Flag that determines if exceptions should be traced by JFR + */ + static volatile boolean jfrTracing; + /** * The JVM saves some indication of the stack backtrace in this slot. */ @@ -256,6 +262,9 @@ public class Throwable implements Serializable { */ public Throwable() { fillInStackTrace(); + if (jfrTracing) { + ThrowableTracer.traceThrowable(getClass(), null); + } } /** @@ -272,6 +281,9 @@ public class Throwable implements Serializable { public Throwable(String message) { fillInStackTrace(); detailMessage = message; + if (jfrTracing) { + ThrowableTracer.traceThrowable(getClass(), message); + } } /** @@ -295,6 +307,9 @@ public class Throwable implements Serializable { fillInStackTrace(); detailMessage = message; this.cause = cause; + if (jfrTracing) { + ThrowableTracer.traceThrowable(getClass(), message); + } } /** @@ -318,6 +333,9 @@ public class Throwable implements Serializable { fillInStackTrace(); detailMessage = (cause==null ? null : cause.toString()); this.cause = cause; + if (jfrTracing) { + ThrowableTracer.traceThrowable(getClass(), null); + } } /** @@ -370,8 +388,12 @@ public class Throwable implements Serializable { } detailMessage = message; this.cause = cause; - if (!enableSuppression) + if (!enableSuppression) { suppressedExceptions = null; + } + if (jfrTracing) { + ThrowableTracer.traceThrowable(getClass(), message); + } } /** diff --git a/src/java.base/share/classes/jdk/internal/event/ErrorThrownEvent.java b/src/java.base/share/classes/jdk/internal/event/ErrorThrownEvent.java new file mode 100644 index 00000000000..c9f4ff3bedc --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/event/ErrorThrownEvent.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.internal.event; + +/** + * Event recording error exceptions. + */ +public final class ErrorThrownEvent extends Event { + public String message; + public Class thrownClass; + + public static void commit(long start, String message, Class thrownClass) { + // Generated by JFR + } + + public static boolean enabled() { + // Generated by JFR + return false; + } + + public static long timestamp() { + // Generated by JFR + return 0; + } +} diff --git a/src/java.base/share/classes/jdk/internal/event/ExceptionStatisticsEvent.java b/src/java.base/share/classes/jdk/internal/event/ExceptionStatisticsEvent.java new file mode 100644 index 00000000000..4ab58b7c0ce --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/event/ExceptionStatisticsEvent.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.internal.event; + +/** + * Event recording number of exceptions that has been created. + */ +public class ExceptionStatisticsEvent extends Event { + + public long throwables; + + public static void commit(long timestamp, long throwables) { + // Generated by JFR + } + + public static boolean enabled() { + // Generated by JFR + return false; + } + + public static long timestamp() { + // Generated by JFR + return 0; + } +} diff --git a/src/java.base/share/classes/jdk/internal/event/ExceptionThrownEvent.java b/src/java.base/share/classes/jdk/internal/event/ExceptionThrownEvent.java new file mode 100644 index 00000000000..45c13e3010d --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/event/ExceptionThrownEvent.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.internal.event; + +/** + * Event recording all exception. + */ +public final class ExceptionThrownEvent extends Event { + public String message; + public Class thrownClass; + + public static void commit(long start, String message, Class thrownClass) { + // Generated by JFR + } + + public static boolean enabled() { + // Generated by JFR + return false; + } + + public static long timestamp() { + // Generated by JFR + return 0; + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ThrowableTracer.java b/src/java.base/share/classes/jdk/internal/event/ThrowableTracer.java similarity index 55% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ThrowableTracer.java rename to src/java.base/share/classes/jdk/internal/event/ThrowableTracer.java index 94a45436938..151312f111f 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ThrowableTracer.java +++ b/src/java.base/share/classes/jdk/internal/event/ThrowableTracer.java @@ -22,47 +22,50 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ +package jdk.internal.event; -package jdk.jfr.internal.instrument; - +import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicLong; -import jdk.jfr.events.EventConfigurations; -import jdk.jfr.events.ErrorThrownEvent; -import jdk.jfr.events.ExceptionThrownEvent; -import jdk.jfr.internal.event.EventConfiguration; - +/** + * Helper class for exception events. + */ public final class ThrowableTracer { private static final AtomicLong numThrowables = new AtomicLong(); - public static void traceError(Error e, String message) { - if (e instanceof OutOfMemoryError) { + public static void enable() throws NoSuchFieldException, IllegalAccessException { + Field field = Throwable.class.getDeclaredField("jfrTracing"); + field.setAccessible(true); + field.setBoolean(null, true); + } + + public static void traceError(Class clazz, String message) { + if (OutOfMemoryError.class.isAssignableFrom(clazz)) { return; } - long timestamp = EventConfiguration.timestamp(); - EventConfiguration eventConfiguration1 = EventConfigurations.ERROR_THROWN; - if (eventConfiguration1.isEnabled()) { - ErrorThrownEvent.commit(timestamp, message, e.getClass()); + if (ErrorThrownEvent.enabled()) { + long timestamp = ErrorThrownEvent.timestamp(); + ErrorThrownEvent.commit(timestamp, message, clazz); } - EventConfiguration eventConfiguration2 = EventConfigurations.EXCEPTION_THROWN; - if (eventConfiguration2.isEnabled()) { - ExceptionThrownEvent.commit(timestamp, message, e.getClass()); + if (ExceptionThrownEvent.enabled()) { + long timestamp = ExceptionThrownEvent.timestamp(); + ExceptionThrownEvent.commit(timestamp, message, clazz); } numThrowables.incrementAndGet(); } - public static void traceThrowable(Throwable t, String message) { - EventConfiguration eventConfiguration = EventConfigurations.EXCEPTION_THROWN; - if (eventConfiguration.isEnabled()) { - long timestamp = EventConfiguration.timestamp(); - ExceptionThrownEvent.commit(timestamp, message, t.getClass()); + public static void traceThrowable(Class clazz, String message) { + if (ExceptionThrownEvent.enabled()) { + long timestamp = ExceptionThrownEvent.timestamp(); + ExceptionThrownEvent.commit(timestamp, message, clazz); } numThrowables.incrementAndGet(); } - public static long numThrowables() { - return numThrowables.get(); + public static void emitStatistics() { + long timestamp = ExceptionStatisticsEvent.timestamp(); + ExceptionStatisticsEvent.commit(timestamp, numThrowables.get()); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ErrorThrownEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ErrorThrownEvent.java index 43f17d6ee62..337cfad20fb 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ErrorThrownEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ErrorThrownEvent.java @@ -28,6 +28,7 @@ import jdk.jfr.Category; import jdk.jfr.Description; import jdk.jfr.Label; import jdk.jfr.Name; +import jdk.jfr.internal.MirrorEvent; import jdk.jfr.internal.RemoveFields; import jdk.jfr.internal.Type; @@ -35,19 +36,12 @@ import jdk.jfr.internal.Type; @Label("Java Error") @Category("Java Application") @Description("An object derived from java.lang.Error has been created. OutOfMemoryErrors are ignored") +@MirrorEvent(className = "jdk.internal.event.ErrorThrownEvent") @RemoveFields("duration") public final class ErrorThrownEvent extends AbstractJDKEvent { - // The order of these fields must be the same as the parameters in - // commit(..., String, Class) - @Label("Message") public String message; @Label("Class") - public Class thrownClass; - - public static void commit(long start, String message, Class thrownClass) { - // Generated - } -} + public Class thrownClass;} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java b/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java index 8853c60ce45..d4dba462f4b 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java @@ -31,6 +31,4 @@ public final class EventConfigurations { public static final EventConfiguration FILE_READ = JVMSupport.getConfiguration(FileReadEvent.class); public static final EventConfiguration FILE_WRITE = JVMSupport.getConfiguration(FileWriteEvent.class); public static final EventConfiguration FILE_FORCE = JVMSupport.getConfiguration(FileForceEvent.class); - public static final EventConfiguration ERROR_THROWN = JVMSupport.getConfiguration(ErrorThrownEvent.class); - public static final EventConfiguration EXCEPTION_THROWN = JVMSupport.getConfiguration(ExceptionThrownEvent.class); } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java index 0c33bcac81b..a5d3f485fad 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java @@ -30,12 +30,14 @@ import jdk.jfr.Description; import jdk.jfr.Label; import jdk.jfr.Name; import jdk.jfr.StackTrace; +import jdk.jfr.internal.MirrorEvent; import jdk.jfr.internal.Type; @Name(Type.EVENT_NAME_PREFIX + "ExceptionStatistics") @Label("Exception Statistics") @Category({ "Java Application", "Statistics" }) @Description("Number of objects derived from java.lang.Throwable that have been created") +@MirrorEvent(className = "jdk.internal.event.ExceptionStatisticsEvent") @StackTrace(false) public final class ExceptionStatisticsEvent extends AbstractPeriodicEvent { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionThrownEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionThrownEvent.java index 719206c8133..c61965755bd 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionThrownEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionThrownEvent.java @@ -29,6 +29,7 @@ import jdk.jfr.Category; import jdk.jfr.Description; import jdk.jfr.Label; import jdk.jfr.Name; +import jdk.jfr.internal.MirrorEvent; import jdk.jfr.internal.RemoveFields; import jdk.jfr.internal.Type; @@ -36,19 +37,13 @@ import jdk.jfr.internal.Type; @Label("Java Exception") @Category("Java Application") @Description("An object derived from java.lang.Exception has been created") +@MirrorEvent(className = "jdk.internal.event.ExceptionThrownEvent") @RemoveFields("duration") public final class ExceptionThrownEvent extends AbstractJDKEvent { - // The order of these fields must be the same as the parameters in - // commit(..., String, Class) - @Label("Message") public String message; @Label("Class") public Class thrownClass; - - public static void commit(long start, String message, Class thrownClass) { - // Generated - } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java index 9da55247d62..62cf72279fc 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/MirrorEvents.java @@ -29,6 +29,9 @@ import java.util.Map; import jdk.jfr.Event; import jdk.jfr.events.DeserializationEvent; +import jdk.jfr.events.ErrorThrownEvent; +import jdk.jfr.events.ExceptionStatisticsEvent; +import jdk.jfr.events.ExceptionThrownEvent; import jdk.jfr.events.ProcessStartEvent; import jdk.jfr.events.SecurityPropertyModificationEvent; import jdk.jfr.events.SecurityProviderServiceEvent; @@ -58,7 +61,10 @@ public final class MirrorEvents { VirtualThreadPinnedEvent.class, VirtualThreadSubmitFailedEvent.class, X509CertificateEvent.class, - X509ValidationEvent.class + X509ValidationEvent.class, + ErrorThrownEvent.class, + ExceptionStatisticsEvent.class, + ExceptionThrownEvent.class, }; private static final Map> mirrorLookup = createLookup(); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorTracerWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorTracerWriter.java deleted file mode 100644 index 50a6a2425db..00000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorTracerWriter.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -import jdk.internal.org.objectweb.asm.ClassReader; -import jdk.internal.org.objectweb.asm.ClassVisitor; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; -import jdk.internal.org.objectweb.asm.Type; - -final class ConstructorTracerWriter extends ClassVisitor { - - private final ConstructorWriter useInputParameter; - private final ConstructorWriter noUseInputParameter; - - static byte[] generateBytes(Class clz, byte[] oldBytes) throws IOException { - InputStream in = new ByteArrayInputStream(oldBytes); - ClassReader cr = new ClassReader(in); - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); - ConstructorTracerWriter ctw = new ConstructorTracerWriter(cw, clz); - cr.accept(ctw, 0); - return cw.toByteArray(); - } - - private ConstructorTracerWriter(ClassVisitor cv, Class classToChange) { - super(Opcodes.ASM7, cv); - useInputParameter = new ConstructorWriter(classToChange, true); - noUseInputParameter = new ConstructorWriter(classToChange, false); - } - - private boolean isConstructor(String name) { - return name.equals(""); - } - - private boolean takesStringParameter(String desc) { - Type[] types = Type.getArgumentTypes(desc); - if (types.length > 0 && types[0].getClassName().equals(String.class.getName())) { - return true; - } - return false; - } - - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - - MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); - - // Get a hold of the constructors that takes a String as a parameter - if (isConstructor(name)) { - if (takesStringParameter(desc)) { - useInputParameter.setMethodVisitor(mv); - return useInputParameter; - } - noUseInputParameter.setMethodVisitor(mv); - return noUseInputParameter; - } - return mv; - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorWriter.java deleted file mode 100644 index b2eec832e0c..00000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/ConstructorWriter.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.instrument; - -import static jdk.internal.org.objectweb.asm.Opcodes.ACONST_NULL; -import static jdk.internal.org.objectweb.asm.Opcodes.ALOAD; -import static jdk.internal.org.objectweb.asm.Opcodes.INVOKESTATIC; -import static jdk.internal.org.objectweb.asm.Opcodes.RETURN; -import jdk.internal.org.objectweb.asm.MethodVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; - -final class ConstructorWriter extends MethodVisitor { - - private final boolean useInputParameter; - private final String shortClassName; - private final String fullClassName; - - ConstructorWriter(Class classToChange, boolean useInputParameter) { - super(Opcodes.ASM7); - this.useInputParameter = useInputParameter; - shortClassName = classToChange.getSimpleName(); - fullClassName = classToChange.getName().replace('.', '/'); - } - - @Override - public void visitInsn(int opcode) - { - if (opcode == RETURN) { - if (useInputParameter) { - useInput(); - } else { - noInput(); - } - } - mv.visitInsn(opcode); - } - @SuppressWarnings("deprecation") - private void useInput() - { - //Load 'this' from local variable 0 - //Load first input parameter - //Invoke ThrowableTracer.traceCLASS(this, parameter) for current class - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESTATIC, "jdk/jfr/internal/instrument/ThrowableTracer", - "trace" + shortClassName, "(L" + fullClassName + - ";Ljava/lang/String;)V"); - } - - @SuppressWarnings("deprecation") - private void noInput() - { - //Load 'this' from local variable 0 - //Load "" - //Invoke ThrowableTracer.traceCLASS(this, "") for current class - mv.visitVarInsn(ALOAD, 0); - mv.visitInsn(ACONST_NULL); - mv.visitMethodInsn(INVOKESTATIC, "jdk/jfr/internal/instrument/ThrowableTracer", - "trace" + shortClassName, "(L" + fullClassName + - ";Ljava/lang/String;)V"); - } - - public void setMethodVisitor(MethodVisitor mv) { - this.mv = mv; - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java index 3c085001e02..f074349e2b2 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Properties; import jdk.internal.access.SharedSecrets; +import jdk.internal.event.ThrowableTracer; import jdk.jfr.Event; import jdk.jfr.events.ActiveRecordingEvent; import jdk.jfr.events.ActiveSettingEvent; @@ -39,9 +40,6 @@ import jdk.jfr.events.ContainerCPUUsageEvent; import jdk.jfr.events.ContainerCPUThrottlingEvent; import jdk.jfr.events.ContainerMemoryUsageEvent; import jdk.jfr.events.DirectBufferStatisticsEvent; -import jdk.jfr.events.ErrorThrownEvent; -import jdk.jfr.events.ExceptionStatisticsEvent; -import jdk.jfr.events.ExceptionThrownEvent; import jdk.jfr.events.FileForceEvent; import jdk.jfr.events.FileReadEvent; import jdk.jfr.events.FileWriteEvent; @@ -66,14 +64,14 @@ public final class JDKEvents { FileWriteEvent.class, SocketReadEvent.class, SocketWriteEvent.class, - ExceptionThrownEvent.class, - ExceptionStatisticsEvent.class, - ErrorThrownEvent.class, ActiveSettingEvent.class, ActiveRecordingEvent.class, // jdk.internal.event.* classes need their mirror // event class to be listed in the MirrorEvents class. jdk.internal.event.DeserializationEvent.class, + jdk.internal.event.ErrorThrownEvent.class, + jdk.internal.event.ExceptionStatisticsEvent.class, + jdk.internal.event.ExceptionThrownEvent.class, jdk.internal.event.ProcessStartEvent.class, jdk.internal.event.SecurityPropertyModificationEvent.class, jdk.internal.event.SecurityProviderServiceEvent.class, @@ -118,11 +116,12 @@ public final class JDKEvents { for (Class eventClass : eventClasses) { SecuritySupport.registerEvent((Class) eventClass); } - PeriodicEvents.addJDKEvent(ExceptionStatisticsEvent.class, emitExceptionStatistics); + PeriodicEvents.addJDKEvent(jdk.internal.event.ExceptionStatisticsEvent.class, emitExceptionStatistics); PeriodicEvents.addJDKEvent(DirectBufferStatisticsEvent.class, emitDirectBufferStatistics); PeriodicEvents.addJDKEvent(InitialSecurityPropertyEvent.class, emitInitialSecurityProperties); initializeContainerEvents(); + ThrowableTracer.enable(); initializationTriggered = true; } } catch (Exception e) { @@ -139,8 +138,6 @@ public final class JDKEvents { targetClasses[i] = clazz; list.add(clazz); } - list.add(java.lang.Throwable.class); - list.add(java.lang.Error.class); Logger.log(LogTag.JFR_SYSTEM, LogLevel.INFO, "Retransformed JDK classes"); JVM.retransformClasses(list.toArray(new Class[list.size()])); } catch (IllegalStateException ise) { @@ -174,9 +171,7 @@ public final class JDKEvents { } private static void emitExceptionStatistics() { - ExceptionStatisticsEvent t = new ExceptionStatisticsEvent(); - t.throwables = ThrowableTracer.numThrowables(); - t.commit(); + ThrowableTracer.emitStatistics(); } private static void emitContainerConfiguration() { @@ -239,16 +234,6 @@ public final class JDKEvents { @SuppressWarnings("deprecation") public static byte[] retransformCallback(Class klass, byte[] oldBytes) throws Throwable { - if (java.lang.Throwable.class == klass) { - Logger.log(LogTag.JFR_SYSTEM, LogLevel.TRACE, "Instrumenting java.lang.Throwable"); - return ConstructorTracerWriter.generateBytes(java.lang.Throwable.class, oldBytes); - } - - if (java.lang.Error.class == klass) { - Logger.log(LogTag.JFR_SYSTEM, LogLevel.TRACE, "Instrumenting java.lang.Error"); - return ConstructorTracerWriter.generateBytes(java.lang.Error.class, oldBytes); - } - for (int i = 0; i < targetClasses.length; i++) { if (targetClasses[i].equals(klass)) { Class c = instrumentationClasses[i]; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JDKEventTask.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JDKEventTask.java index edd44ac8f14..73d4f5479eb 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JDKEventTask.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JDKEventTask.java @@ -24,7 +24,7 @@ */ package jdk.jfr.internal.periodic; -import jdk.jfr.Event; +import jdk.internal.event.Event; /** * Periodic task that runs trusted code that doesn't require an access control diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JavaEventTask.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JavaEventTask.java index 4fa217924fd..18729685a6d 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JavaEventTask.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/JavaEventTask.java @@ -24,7 +24,7 @@ */ package jdk.jfr.internal.periodic; -import jdk.jfr.Event; +import jdk.internal.event.Event; import jdk.jfr.EventType; import jdk.jfr.internal.MetadataRepository; import jdk.jfr.internal.PlatformEventType; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java index 8695a5e0e39..a68af8ad25b 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java @@ -29,7 +29,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicLong; -import jdk.jfr.Event; +import jdk.internal.event.Event; import jdk.jfr.internal.JVM; import jdk.jfr.internal.LogLevel; import jdk.jfr.internal.LogTag; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/UserEventTask.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/UserEventTask.java index c591647aefb..1241cd7fb0b 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/UserEventTask.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/UserEventTask.java @@ -29,7 +29,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Objects; -import jdk.jfr.Event; +import jdk.internal.event.Event; import jdk.jfr.internal.LogLevel; import jdk.jfr.internal.LogTag; import jdk.jfr.internal.Logger;