From 9039081c254e2ca32bfbd69612c45a862d0f41aa Mon Sep 17 00:00:00 2001 From: Jean-Philippe Bempel Date: Tue, 8 Sep 2026 14:41:14 +0200 Subject: [PATCH 1/3] Fix NullPointerException in Exception Replay For FastThrow, getStackTrace can return null instead of empty StackTraceElement array --- .../datadog/debugger/exception/DefaultExceptionDebugger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java index e2921f490bd..80edeb49659 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java @@ -54,7 +54,7 @@ protected boolean shouldHandleException(Throwable t, AgentSpan span) { } // do not handle exception with no stacktrace. cannot capture anything for it. // includes also FastThrow ones - if (t.getStackTrace().length == 0) { + if (t.getStackTrace() == null || t.getStackTrace().length == 0) { return false; } return circuitBreaker.trip(); From b1f984ddbe6c4d9a064b245a8a2554ba7efe584c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Bempel Date: Tue, 8 Sep 2026 21:36:31 +0200 Subject: [PATCH 2/3] call only once getStackTrace --- .../datadog/debugger/exception/DefaultExceptionDebugger.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java index 80edeb49659..601fca62d52 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java @@ -54,7 +54,8 @@ protected boolean shouldHandleException(Throwable t, AgentSpan span) { } // do not handle exception with no stacktrace. cannot capture anything for it. // includes also FastThrow ones - if (t.getStackTrace() == null || t.getStackTrace().length == 0) { + StackTraceElement[] stackTrace = t.getStackTrace(); + if (stackTrace == null || stackTrace.length == 0) { return false; } return circuitBreaker.trip(); From 027c1bfab5215e0bf935608cc5015e3be4eae2ad Mon Sep 17 00:00:00 2001 From: Jean-Philippe Bempel Date: Thu, 10 Sep 2026 07:43:29 +0200 Subject: [PATCH 3/3] fix possible NPE from chained exceptions --- .../debugger/exception/AbstractExceptionDebugger.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java index eb8abc565de..e92f65ef223 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java @@ -93,9 +93,12 @@ public void handleException(Throwable t, AgentSpan span) { Throwable throwable; int chainedExceptionIdx = 0; while ((throwable = chainedExceptions.pollFirst()) != null) { + StackTraceElement[] stackTrace = throwable.getStackTrace(); + if (stackTrace == null || stackTrace.length == 0) { + continue; + } ExceptionProbeManager.CreationResult creationResult = - exceptionProbeManager.createProbesForException( - throwable.getStackTrace(), chainedExceptionIdx); + exceptionProbeManager.createProbesForException(stackTrace, chainedExceptionIdx); if (creationResult.probesCreated > 0) { if (!applyConfigAsync) { applyExceptionConfiguration(fingerprint);