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();