From 13457249299f7a47d2c66ee328b67db2146a4e66 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 25 May 2016 21:10:09 +0300 Subject: [PATCH] IDEA-156429 Debugger regularly shows "Address already in use" --- .../debugger/DefaultDebugEnvironment.java | 17 +++++++++++++---- .../debugger/engine/DebugProcessImpl.java | 10 ++++++++-- .../debugger/impl/GenericDebuggerRunner.java | 8 ++++++-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java index e729dd3898ed..b98bd4c9509c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java @@ -15,12 +15,11 @@ */ package com.intellij.debugger; +import com.intellij.debugger.impl.DebuggerManagerImpl; +import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionResult; -import com.intellij.execution.configurations.RemoteConnection; -import com.intellij.execution.configurations.RemoteState; -import com.intellij.execution.configurations.RunProfileState; -import com.intellij.execution.configurations.SearchScopeProvider; +import com.intellij.execution.configurations.*; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; @@ -31,6 +30,7 @@ public class DefaultDebugEnvironment implements DebugEnvironment { private final boolean myPollConnection; private final ExecutionEnvironment environment; private final RunProfileState state; + private final boolean myNeedParametersSet; public DefaultDebugEnvironment(@NotNull ExecutionEnvironment environment, @NotNull RunProfileState state, RemoteConnection remoteConnection, boolean pollConnection) { this.environment = environment; @@ -39,10 +39,19 @@ public class DefaultDebugEnvironment implements DebugEnvironment { myPollConnection = pollConnection; mySearchScope = SearchScopeProvider.createSearchScope(environment.getProject(), environment.getRunProfile()); + myNeedParametersSet = remoteConnection.isServerMode() && remoteConnection.isUseSockets() && "0".equals(remoteConnection.getAddress()); } @Override public ExecutionResult createExecutionResult() throws ExecutionException { + // debug port may have changed, reinit parameters just in case + if (myNeedParametersSet && state instanceof JavaCommandLine) { + DebuggerManagerImpl.createDebugParameters(((JavaCommandLine)state).getJavaParameters(), + true, + DebuggerSettings.SOCKET_TRANSPORT, + myRemoteConnection.getAddress(), + false); + } return state.execute(environment.getExecutor(), environment.getRunner()); } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index ed583f404a05..9c14f9379e26 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -493,7 +493,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb if (address == null) { throw new CantRunException(DebuggerBundle.message("error.no.debug.listen.port")); } - // negative port number means the caller leaves to debugger to decide at which port to listen + // zero port number means the caller leaves to debugger to decide at which port to listen //noinspection HardCodedStringLiteral final Connector.Argument portArg = myConnection.isUseSockets() ? myArguments.get("port") : myArguments.get("name"); if (portArg != null) { @@ -504,7 +504,13 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb if (timeoutArg != null) { timeoutArg.setValue("0"); // wait forever } - connector.startListening(myArguments); + String listeningAddress = connector.startListening(myArguments); + String port = StringUtil.substringAfter(listeningAddress, ":"); + if (port != null) { + listeningAddress = port; + } + myConnection.setAddress(listeningAddress); + myDebugProcessDispatcher.getMulticaster().connectorIsReady(); try { return connector.accept(myArguments); diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerRunner.java b/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerRunner.java index eb2549f31cb8..1a2f1442cb67 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerRunner.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/GenericDebuggerRunner.java @@ -73,8 +73,12 @@ public class GenericDebuggerRunner extends JavaPatchableProgramRunner