From b1e05e39a27b5cbd32c71f0d0e5a46ee8c9d1f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Costa?= Date: Tue, 28 Apr 2026 20:38:00 +0100 Subject: [PATCH 1/2] Ignore VMDisconnected on detach; reorder terminate Wrap vm.dispose() in a try/catch to ignore VMDisconnectedException when the VM has already disconnected (e.g. process terminated) to avoid spurious errors during detach. Reorder calls in DisconnectRequestHandler to invoke terminate() before detach() when terminateDebuggee is true and the session is not attached, ensuring the debuggee is terminated prior to detaching. --- .../java/com/microsoft/java/debug/core/DebugSession.java | 6 +++++- .../core/adapter/handler/DisconnectRequestHandler.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/DebugSession.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/DebugSession.java index d5b8ceb4..c040f5b7 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/DebugSession.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/DebugSession.java @@ -117,7 +117,11 @@ public void resume() { @Override public void detach() { - vm.dispose(); + try { + vm.dispose(); + } catch (VMDisconnectedException ex) { + // ignore — VM already disconnected (e.g. process was terminated first) + } } @Override diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java index eed3cc2e..b4caf401 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java @@ -26,8 +26,8 @@ public void destroyDebugSession(Command command, Arguments arguments, Response r IDebugSession debugSession = context.getDebugSession(); if (debugSession != null) { if (disconnectArguments.terminateDebuggee && !context.isAttached()) { - debugSession.detach(); debugSession.terminate(); + debugSession.detach(); } else { debugSession.detach(); } From fdd4831c436d85010956bc178eda86445ab4c9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Costa?= Date: Wed, 29 Apr 2026 13:21:08 +0100 Subject: [PATCH 2/2] Always detach debug session on terminate Wrap debugSession.terminate() in a try/finally so debugSession.detach() is always invoked when terminateDebuggee is true and the session is not attached. This ensures the session is detached even if terminate() throws, avoiding potential dangling sessions. Other detach logic is unchanged. --- .../core/adapter/handler/DisconnectRequestHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java index b4caf401..c38af257 100644 --- a/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java +++ b/com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/handler/DisconnectRequestHandler.java @@ -26,8 +26,11 @@ public void destroyDebugSession(Command command, Arguments arguments, Response r IDebugSession debugSession = context.getDebugSession(); if (debugSession != null) { if (disconnectArguments.terminateDebuggee && !context.isAttached()) { - debugSession.terminate(); - debugSession.detach(); + try { + debugSession.terminate(); + } finally { + debugSession.detach(); + } } else { debugSession.detach(); }