diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/InferiorRuntimeProcess.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/InferiorRuntimeProcess.java index 082b2feef64..fabd877286c 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/InferiorRuntimeProcess.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/InferiorRuntimeProcess.java @@ -23,7 +23,10 @@ import org.eclipse.debug.core.model.RuntimeProcess; import com.ibm.icu.text.MessageFormat; /** - * A process for the inferior to know it belongs to a DSF-GDB session + * A process for the inferior to know it belongs to a DSF-GDB session. + * This class also adds the exit code of the inferior to the console. + * + * Note that this class is also used in Run mode. * * @since 4.0 */ diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java index eef9929e3d7..7b85457202e 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java @@ -8,6 +8,7 @@ * Contributors: * QNX Software Systems - initial API and implementation * Marc Khouzam (Ericsson) - Modified to only handle Run mode and modernized (Bug 464636) + * Marc Khouzam (Ericsson) - Show exit code in console when doing a Run (Bug 463975) *******************************************************************************/ package org.eclipse.cdt.launch.internal; @@ -16,6 +17,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; @@ -33,6 +36,7 @@ import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; import com.ibm.icu.text.DateFormat; @@ -92,12 +96,28 @@ public class LocalRunLaunchDelegate extends AbstractCLaunchDelegate2 String timestamp = DateFormat.getInstance().format(new Date(System.currentTimeMillis())); String processLabel = String.format("%s (%s)", commandArray[0], timestamp); //$NON-NLS-1$ - DebugPlugin.newProcess(launch, process, processLabel); + + DebugPlugin.newProcess(launch, process, processLabel, createProcessAttributes()); } finally { monitor.done(); } } + protected Map createProcessAttributes() { + Map attributes = new HashMap<>(); + + // Specify that the process factory (GdbProcessFactory) should use InferiorRuntimeProcess to wrap + // the process that we are about to run. + // Note that GdbProcessFactory is only used for launches created using DSF-GDB not CDI + attributes.put("org.eclipse.cdt.dsf.gdb.createProcessType" /* IGdbDebugConstants.PROCESS_TYPE_CREATION_ATTR */, //$NON-NLS-1$ + "org.eclipse.cdt.dsf.gdb.inferiorProcess" /* IGdbDebugConstants.INFERIOR_PROCESS_CREATION_VALUE */); //$NON-NLS-1$ + + // Show the exit code of the process in the console title once it has terminated + attributes.put("org.eclipse.cdt.dsf.gdb.inferiorExited" /* IGdbDebugConstants.INFERIOR_EXITED_ATTR */, //$NON-NLS-1$ + ""); //$NON-NLS-1$ + return attributes; + } + /** * Method used to check that the project and program are correct. * Can be overridden to avoid checking certain things. @@ -139,9 +159,31 @@ public class LocalRunLaunchDelegate extends AbstractCLaunchDelegate2 @Override public boolean preLaunchCheck(ILaunchConfiguration config, String mode, IProgressMonitor monitor) throws CoreException { + // Setup default Process Factory + setDefaultProcessFactory(config); + return super.preLaunchCheck(config, mode, monitor); } + /** + * Modify the ILaunchConfiguration to set the DebugPlugin.ATTR_PROCESS_FACTORY_ID attribute, + * so as to specify the process factory to use. + * + * This attribute should only be set if it is not part of the configuration already, to allow + * other code to set it to something else. + */ + protected void setDefaultProcessFactory(ILaunchConfiguration config) throws CoreException { + if (!config.hasAttribute(DebugPlugin.ATTR_PROCESS_FACTORY_ID)) { + ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); + // Use the debug process factory as it provides extra features for the program + // that is being debugged or in this case run. + // Effectively, we want to use InferiorRuntimeProcess when doing this Run launch. + wc.setAttribute(DebugPlugin.ATTR_PROCESS_FACTORY_ID, + "org.eclipse.cdt.dsf.gdb.GdbProcessFactory"); //$NON-NLS-1$ + wc.doSave(); + } + } + @Override protected String getPluginID() { return LaunchUIPlugin.getUniqueIdentifier();