{"record":{"id":"05891c1d00689dad","repo":"oracle/graal","slug":"concurrent-setting-of-breakpoint","errorCode":null,"errorMessage":"concurrent setting of breakpoint","messagePattern":"concurrent setting of breakpoint","errorType":"exception","errorClass":"PermanentBailoutException","httpStatus":null,"severity":"info","filePath":"compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java","lineNumber":5975,"sourceCode":"            case INVOKESPECIAL  : cpi = stream.readCPI(); genInvokeSpecial(cpi, opcode); break;\n            case INVOKESTATIC   : cpi = stream.readCPI(); genInvokeStatic(cpi, opcode); break;\n            case INVOKEINTERFACE: cpi = stream.readCPI(); genInvokeInterface(cpi, opcode); break;\n            case INVOKEDYNAMIC  : cpi = stream.readCPI4(); genInvokeDynamic(cpi, opcode); break;\n            case NEW            : genNewInstance(stream.readCPI()); break;\n            case NEWARRAY       : genNewPrimitiveArray(stream.readLocalIndex()); break;\n            case ANEWARRAY      : genNewObjectArray(stream.readCPI()); break;\n            case ARRAYLENGTH    : genArrayLength(); break;\n            case ATHROW         : genThrow(); break;\n            case CHECKCAST      : genCheckCast(stream.readCPI()); break;\n            case INSTANCEOF     : genInstanceOf(stream.readCPI()); break;\n            case MONITORENTER   : genMonitorEnter(frameState.pop(JavaKind.Object), stream.nextBCI()); break;\n            case MONITOREXIT    : genMonitorExit(frameState.pop(JavaKind.Object), null, stream.nextBCI(), false, true); break;\n            case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break;\n            case IFNULL         : genIfNull(Condition.EQ); break;\n            case IFNONNULL      : genIfNull(Condition.NE); break;\n            case GOTO_W         : genGoto(); break;\n            case JSR_W          : genJsr(stream.readBranchDest()); break;\n            case BREAKPOINT     : throw new PermanentBailoutException(\"concurrent setting of breakpoint\");\n            default             : throw new PermanentBailoutException(\"Unsupported opcode %d (%s) [bci=%d]\", opcode, nameOf(opcode), bci);\n        }\n        // @formatter:on\n        // Checkstyle: resume\n    }\n\n    private void genArrayLength() {\n        ValueNode array = frameState.pop(JavaKind.Object);\n        frameState.push(JavaKind.Int, append(genArrayLength(array)));\n    }\n\n    @Override\n    public ResolvedJavaMethod getMethod() {\n        return method;\n    }\n\n    @Override\n    public Bytecode getCode() {","sourceCodeStart":5957,"sourceCodeEnd":5993,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java#L5957-L5993","documentation":"Thrown by BytecodeParser when it encounters the BREAKPOINT opcode (0xc2) in the bytecode stream while parsing. The breakpoint opcode is written into bytecode by debuggers (JVMTI SetBreakpoint) at runtime; a class file parsed with that opcode present means the bytecode was mutated concurrently, so Graal permanently bails out rather than compile transient debug state.","triggerScenarios":"stream bytecode == Bytecodes.BREAKPOINT during processBytecode — i.e. a breakpoint was set in the method between the moment HotSpot fetched the bytecode and Graal parsing it (concurrent JVMTI SetBreakpoint), or a class file literally containing opcode 0xc2.","commonSituations":"Attaching a debugger (or a coverage/profiling agent using breakpoints) to a JVM while Graal compiles the same method; race between debugger instrumentation and JIT compilation; class files emitted by bytecode tools that misuse 0xc2.","solutions":["Remove the breakpoint in the debugger and let HotSpot re-attempt compilation of the method.","Recompile/relaunch without the debugger attached for benchmarking or production JIT behavior.","If caused by an agent, configure it to use non-breakpoint instrumentation (e.g. class retransformation instead)."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"// transient debugger-induced bailout; HotSpot retries after the breakpoint is removed.","preventionTips":["Detach debuggers before benchmarking or production runs.","Prefer JVMTI class-retransformation agents over breakpoint-based ones on Graal JVMs."],"tags":["graalvm","bytecode-parsing","breakpoint","debugger","bailout"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}