{"record":{"id":"aca20bb96905fecc","repo":"pinpoint-apm/pinpoint","slug":"define-fail-cl-caused-by","errorCode":null,"errorMessage":"{} define fail cl:{} Caused by:{}","messagePattern":"(.+?) define fail cl:(.+?) Caused by:(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agent-module/profiler-optional/profiler-optional-jdk9/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/Java9DefineClass.java","lineNumber":39,"sourceCode":"import org.apache.logging.log4j.Logger;\n\n/**\n * @author Woonduk Kang(emeroad)\n */\nfinal class Java9DefineClass implements DefineClass {\n\n    private final Logger logger = LogManager.getLogger(this.getClass());\n\n    @Override\n    public Class<?> defineClass(ClassLoader classLoader, String name, byte[] bytes) {\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"define class:{} cl:{}\", name, classLoader);\n        }\n        final JavaLangAccess javaLangAccess = JavaLangAccessHelper.getJavaLangAccess();\n        try {\n            return javaLangAccess.defineClass(classLoader, name, bytes, null, null);\n        } catch (Throwable e) {\n            logger.warn(\"{} define fail cl:{} Caused by:{}\", name, classLoader, e.getMessage(), e);\n            throw new RuntimeException(name + \" define fail Caused by:\" + e.getMessage(), e);\n        }\n    }\n}\n","sourceCodeStart":21,"sourceCodeEnd":44,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler-optional/profiler-optional-jdk9/src/main/java/com/navercorp/pinpoint/profiler/instrument/classloading/Java9DefineClass.java#L21-L44","documentation":"Java9DefineClass.defineClass uses JavaLangAccess.defineClass (shared secrets API) to inject transformed classes into a classloader on JDK 9+. Any failure of that internal define call is caught, logged as '<name> define fail cl:<classLoader> Caused by:<msg>', and rethrown as a RuntimeException. This means bytecode transformation succeeded but the class could not be defined into the target loader.","triggerScenarios":"Calling defineClass with bytes whose class name does not match 'name', a classLoader rejected by javaLangAccess.defineClass (e.g. null incompatibility), or on a JDK where jdk.internal.misc.JavaLangAccess.defineClass signature changed.","commonSituations":"Upgrading to a JDK 9/10/11 early-access build where the internal JavaLangAccess API changed; duplicate class definition for the same loader; sealed packages or module access restrictions blocking definition.","solutions":["Read 'Caused by' in the RuntimeException for the underlying reason (LinkageError, SecurityException, etc.)","Check the target JDK build is one supported by this Pinpoint version; upgrade Pinpoint agent for newer JDKs","Verify the transformed bytecode's internal class name matches the 'name' passed to defineClass","If a module/sealing issue, add --add-exports for jdk.internal.misc or run the agent on a compatible JVM"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// JDK capability check before instrumenting\nClass<?> acc = Class.forName(\"jdk.internal.misc.JavaLangAccess\", false, null);","typeGuard":null,"tryCatchPattern":"try { return javaLangAccess.defineClass(classLoader, name, bytes, null, null); }\ncatch (Throwable e) { logger.warn(\"{} define fail cl:{} Caused by:{}\", name, classLoader, e.getMessage(), e); throw new RuntimeException(...); }","preventionTips":["Keep agent and JDK versions matched to Pinpoint's compatibility matrix","Never transform bytecode in ways that change the class's internal name","Watch for JDK internal API moves (jdk.internal.misc -> jdk.internal.access)"],"tags":["classloading","jdk9","instrumentation","internal-api"],"backgroundTag":"class-not-found","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}