From 659943620af7df192eef9f171f9d5d72373ab512 Mon Sep 17 00:00:00 2001 From: jean-philippe bempel Date: Sun, 12 Jul 2026 15:40:42 +0200 Subject: [PATCH] fix computeFrames call make sure it is called before any instrumentation. for CaptureContextInstrumenter, processInstructions is called after some instrumentation at the beginning of the method. so extract computeFrames outside of processInstructions and return directly the frames Map. --- .../CapturedContextInstrumenter.java | 3 ++- .../instrumentation/ExceptionInstrumenter.java | 3 ++- .../debugger/instrumentation/Instrumenter.java | 17 +++++++++++------ .../instrumentation/MetricInstrumenter.java | 4 +++- .../instrumentation/SpanInstrumenter.java | 7 ++++++- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java index 719618d1745..6a6f4077984 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java @@ -99,9 +99,10 @@ public InstrumentationResult.Status instrument() { installFinallyBlocks(); return InstrumentationResult.Status.INSTALLED; } + Map> frames = computeFrames(classNode.name, methodNode); instrumentMethodEnter(); instrumentTryCatchHandlers(); - processInstructions(); + processInstructions(frames); addFinallyHandler(contextInitLabel, returnHandlerLabel); installFinallyBlocks(); return InstrumentationResult.Status.INSTALLED; diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ExceptionInstrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ExceptionInstrumenter.java index 54d3a95f45a..245d95e124d 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ExceptionInstrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ExceptionInstrumenter.java @@ -21,7 +21,8 @@ public ExceptionInstrumenter( @Override public InstrumentationResult.Status instrument() { - processInstructions(); // fill returnHandlerLabel + Map> frames = computeFrames(classNode.name, methodNode); + processInstructions(frames); // fill returnHandlerLabel addFinallyHandler(methodEnterLabel, returnHandlerLabel); installFinallyBlocks(); return InstrumentationResult.Status.INSTALLED; diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java index 8cea46898d8..a1549bac9a5 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java @@ -159,9 +159,7 @@ private AbstractInsnNode findFirstInsnForConstructor(AbstractInsnNode first) { return lastInvokeSpecial; } - protected void processInstructions() { - Map> frames = new IdentityHashMap<>(); - computeFrames(classNode.name, methodNode, frames); + protected void processInstructions(Map> frames) { AbstractInsnNode node = methodNode.instructions.getFirst(); LabelNode sentinelNode = new LabelNode(); methodNode.instructions.add(sentinelNode); @@ -195,8 +193,9 @@ protected InsnList stackCleanupInsnList( return result; } - private static void computeFrames( - String owner, MethodNode methodNode, Map> frames) { + protected static Map> computeFrames( + String owner, MethodNode methodNode) { + Map> frames = new IdentityHashMap<>(); try { Frame[] frameArray = new Analyzer<>(new BasicInterpreter()).analyze(owner, methodNode); @@ -207,8 +206,14 @@ private static void computeFrames( current = current.getNext(); } } catch (AnalyzerException ex) { - LOGGER.debug("Failed to analyze method[{}::{}] instructions", owner, methodNode.name, ex); + LOGGER.debug( + "Failed to analyze method[{}::{}{}] instructions", + owner, + methodNode.name, + methodNode.desc, + ex); } + return frames; } protected AbstractInsnNode processInstruction( diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java index 23008148c98..d08e8eb1874 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java @@ -111,7 +111,9 @@ public InstrumentationResult.Status instrument() { } case EXIT: { - processInstructions(); + Map> frames = + computeFrames(classNode.name, methodNode); + processInstructions(frames); addFinallyHandler(returnHandlerLabel); installFinallyBlocks(); break; diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/SpanInstrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/SpanInstrumenter.java index 2bb9a21f3c1..b50eedfec1d 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/SpanInstrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/SpanInstrumenter.java @@ -13,13 +13,17 @@ import com.datadog.debugger.probe.Where; import com.datadog.debugger.util.ClassFileLines; import java.util.List; +import java.util.Map; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.TryCatchBlockNode; import org.objectweb.asm.tree.VarInsnNode; +import org.objectweb.asm.tree.analysis.BasicValue; +import org.objectweb.asm.tree.analysis.Frame; public class SpanInstrumenter extends Instrumenter { private int spanVar; @@ -38,7 +42,8 @@ public InstrumentationResult.Status instrument() { return addRangeSpan(classFileLines); } spanVar = newVar(DEBUGGER_SPAN_TYPE); - processInstructions(); + Map> frames = computeFrames(classNode.name, methodNode); + processInstructions(frames); LabelNode initSpanLabel = new LabelNode(); InsnList insnList = createSpan(initSpanLabel); LabelNode endLabel = new LabelNode();