1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

support attach to pid with debugger

This commit is contained in:
David Inglis 2002-09-17 19:12:15 +00:00
parent 60f24d786e
commit 0f1255a4e0
3 changed files with 45 additions and 15 deletions

View file

@ -23,7 +23,7 @@
point="org.eclipse.cdt.debug.core.CDebugger"> point="org.eclipse.cdt.debug.core.CDebugger">
<debugger <debugger
name="%GDBDebugger.name" name="%GDBDebugger.name"
modes="run,core" modes="run,core,attach"
class="org.eclipse.cdt.debug.mi.core.GDBDebugger" class="org.eclipse.cdt.debug.mi.core.GDBDebugger"
id="org.eclipse.cdt.debug.mi.core.CDebugger"> id="org.eclipse.cdt.debug.mi.core.CDebugger">
</debugger> </debugger>

View file

@ -121,6 +121,9 @@ public interface ICDTLaunchConfigurationConstants {
*/ */
public static final int ERR_DEBUGGER_NOT_INSTALLED = 102; public static final int ERR_DEBUGGER_NOT_INSTALLED = 102;
public static final int ERR_NO_PROCESSID = 103;
public static final int ERR_NO_COREFILE = 104;
/** /**
* Status code indicating an unexpected internal error. * Status code indicating an unexpected internal error.
*/ */

View file

@ -13,6 +13,9 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IProcessInfo;
import org.eclipse.cdt.core.IProcessList;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugModel; import org.eclipse.cdt.debug.core.CDebugModel;
@ -42,9 +45,15 @@ import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchManager; import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.IStatusHandler; import org.eclipse.debug.core.IStatusHandler;
import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.IProcess;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.ListSelectionDialog;
/** /**
* Insert the type's description here. * Insert the type's description here.
@ -120,29 +129,20 @@ public class LocalCLaunchConfigurationDelegate extends AbstractCLaunchDelegate {
else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH)) { else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH)) {
int pid = getProcessID(); int pid = getProcessID();
if ( pid == -1 ) { if ( pid == -1 ) {
monitor.setCanceled(true); abort("No Process ID selected", null, ICDTLaunchConfigurationConstants.ERR_NO_PROCESSID);
return;
} }
dsession = cdebugger.createAttachSession(config, exe, pid); dsession = cdebugger.createAttachSession(config, exe, pid);
} }
else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE)) { else if (debugMode.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE)) {
IPath corefile = getCoreFilePath((IProject)cproject.getResource()); IPath corefile = getCoreFilePath((IProject)cproject.getResource());
if ( corefile == null ) { if ( corefile == null ) {
monitor.setCanceled(true); abort("No Corefile selected", null, ICDTLaunchConfigurationConstants.ERR_NO_COREFILE);
return;
} }
dsession = cdebugger.createCoreSession(config, exe, corefile); dsession = cdebugger.createCoreSession(config, exe, corefile);
} }
} }
catch (CDIException e) { catch (CDIException e) {
IStatus status = abort( "Failed Launching CDI Debugger", e, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
new Status(
0,
LaunchUIPlugin.getUniqueIdentifier(),
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR,
"CDI Error",
e);
throw new CoreException(status);
} }
ICDIRuntimeOptions opt = dsession.getRuntimeOptions(); ICDIRuntimeOptions opt = dsession.getRuntimeOptions();
opt.setArguments(getProgramArgumentsArray(config)); opt.setArguments(getProgramArgumentsArray(config));
@ -206,7 +206,34 @@ public class LocalCLaunchConfigurationDelegate extends AbstractCLaunchDelegate {
private int getProcessID() { private int getProcessID() {
return -1; final Shell shell = LaunchUIPlugin.getShell();
final int pid[] = {-1};
if ( shell == null )
return -1;
Display display = shell.getDisplay();
display.syncExec(new Runnable() {
public void run() {
ElementListSelectionDialog dialog = new ElementListSelectionDialog( shell, new LabelProvider() {
public String getText(Object element) {
IProcessInfo info = (IProcessInfo)element;
return info.getPid() + " " + info.getName();
}
} );
dialog.setTitle( "Select Process" );
dialog.setMessage("Select a Process to attach debugger to:");
IProcessList plist = CCorePlugin.getDefault().getProcessList();
if ( plist == null ) {
MessageDialog.openError(shell, "CDT Launch Error", "Current platform does not support listing processes");
return;
}
dialog.setElements(plist.getProcessList());
if ( dialog.open() == dialog.OK ) {
IProcessInfo info = (IProcessInfo)dialog.getFirstResult();
pid[0] = info.getPid();
}
}
});
return pid[0];
} }
@ -238,7 +265,7 @@ public class LocalCLaunchConfigurationDelegate extends AbstractCLaunchDelegate {
if (p != null) { if (p != null) {
p.destroy(); p.destroy();
} }
abort("Exception starting process", e, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); abort("Error starting process", e, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR);
} }
catch (NoSuchMethodError e) { catch (NoSuchMethodError e) {
//attempting launches on 1.2.* - no ability to set working directory //attempting launches on 1.2.* - no ability to set working directory