mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 13:25:45 +02:00
[202346] Support for postmortem debugging in DSF-GDB
This commit is contained in:
parent
2646066384
commit
ea4d177c6c
19 changed files with 834 additions and 223 deletions
|
@ -109,6 +109,39 @@
|
||||||
<associatedDelegate delegate="org.eclipse.cdt.dsf.gdb.launch.attachCLaunch"/>
|
<associatedDelegate delegate="org.eclipse.cdt.dsf.gdb.launch.attachCLaunch"/>
|
||||||
<placement after="org.eclipse.debug.ui.sourceLookupTab"/>
|
<placement after="org.eclipse.debug.ui.sourceLookupTab"/>
|
||||||
</tab>
|
</tab>
|
||||||
|
|
||||||
|
<!-- PostMortem launch tabs-->
|
||||||
|
<tab
|
||||||
|
id="org.eclipse.cdt.dsf.gdb.launch.coreLaunch.mainTab"
|
||||||
|
group="org.eclipse.cdt.launch.postmortemLaunchTabGroup"
|
||||||
|
name="%launchTab.main.name"
|
||||||
|
class="org.eclipse.cdt.dsf.gdb.internal.ui.launching.CMainCoreTab">
|
||||||
|
<associatedDelegate delegate="org.eclipse.cdt.dsf.gdb.launch.coreCLaunch"/>
|
||||||
|
</tab>
|
||||||
|
<tab
|
||||||
|
id="org.eclipse.cdt.dsf.gdb.launch.coreLaunch.debuggerTab"
|
||||||
|
group="org.eclipse.cdt.launch.postmortemLaunchTabGroup"
|
||||||
|
name="%launchTab.debugger.name"
|
||||||
|
class="org.eclipse.cdt.dsf.gdb.internal.ui.launching.CoreFileDebuggerTab">
|
||||||
|
<associatedDelegate delegate="org.eclipse.cdt.dsf.gdb.launch.coreCLaunch"/>
|
||||||
|
<placement after="org.eclipse.cdt.dsf.gdb.launch.mainTab"/>
|
||||||
|
</tab>
|
||||||
|
<tab
|
||||||
|
id="org.eclipse.cdt.dsf.gdb.launch.coreLaunch.sourceLookupTab"
|
||||||
|
group="org.eclipse.cdt.launch.postmortemLaunchTabGroup"
|
||||||
|
name="%launchTab.sourceLookup.name"
|
||||||
|
class="org.eclipse.debug.ui.sourcelookup.SourceLookupTab">
|
||||||
|
<associatedDelegate delegate="org.eclipse.cdt.dsf.gdb.launch.coreCLaunch"/>
|
||||||
|
<placement after="org.eclipse.cdt.dsf.gdb.launch.debuggerTab"/>
|
||||||
|
</tab>
|
||||||
|
<tab
|
||||||
|
id="org.eclipse.cdt.dsf.gdb.launch.coreLaunch.commonTab"
|
||||||
|
group="org.eclipse.cdt.launch.postmortemLaunchTabGroup"
|
||||||
|
name="%launchTab.common.name"
|
||||||
|
class="org.eclipse.debug.ui.CommonTab">
|
||||||
|
<associatedDelegate delegate="org.eclipse.cdt.dsf.gdb.launch.coreCLaunch"/>
|
||||||
|
<placement after="org.eclipse.debug.ui.sourceLookupTab"/>
|
||||||
|
</tab>
|
||||||
</extension>
|
</extension>
|
||||||
|
|
||||||
<extension
|
<extension
|
||||||
|
@ -160,6 +193,12 @@
|
||||||
id="org.eclipse.cdt.dsf.gdb.ui.processPrompter"
|
id="org.eclipse.cdt.dsf.gdb.ui.processPrompter"
|
||||||
plugin="org.eclipse.cdt.dsf.gdb.ui">
|
plugin="org.eclipse.cdt.dsf.gdb.ui">
|
||||||
</statusHandler>
|
</statusHandler>
|
||||||
|
<statusHandler
|
||||||
|
class="org.eclipse.cdt.dsf.gdb.internal.ui.launching.CoreFilePrompter"
|
||||||
|
code="1001"
|
||||||
|
id="org.eclipse.cdt.dsf.gdb.ui.coreFilePrompter"
|
||||||
|
plugin="org.eclipse.cdt.dsf.gdb.ui">
|
||||||
|
</statusHandler>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.cdt.debug.ui.CDebuggerPage">
|
point="org.eclipse.cdt.debug.ui.CDebuggerPage">
|
||||||
|
|
|
@ -13,17 +13,11 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
|
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import com.ibm.icu.text.Collator;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.IBinaryParser;
|
|
||||||
import org.eclipse.cdt.core.ICExtensionReference;
|
|
||||||
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
|
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
||||||
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
|
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
|
||||||
|
@ -39,8 +33,6 @@ import org.eclipse.cdt.dsf.gdb.service.SessionType;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
|
||||||
import org.eclipse.core.runtime.Path;
|
|
||||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
|
@ -59,6 +51,8 @@ import org.eclipse.swt.widgets.Composite;
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.swt.widgets.Text;
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
|
||||||
|
import com.ibm.icu.text.Collator;
|
||||||
|
|
||||||
public class CDebuggerTab extends AbstractCDebuggerTab {
|
public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -68,13 +62,14 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
*
|
*
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
*/
|
*/
|
||||||
public static final String TAB_ID = "org.eclipse.cdt.dsf.gdb.launch.debuggerTab";
|
public static final String TAB_ID = "org.eclipse.cdt.dsf.gdb.launch.debuggerTab"; //$NON-NLS-1$
|
||||||
|
|
||||||
private final static String LOCAL_DEBUGGER_ID = "org.eclipse.cdt.dsf.gdb.GdbDebugger";//$NON-NLS-1$
|
private final static String LOCAL_DEBUGGER_ID = "org.eclipse.cdt.dsf.gdb.GdbDebugger";//$NON-NLS-1$
|
||||||
private final static String REMOTE_DEBUGGER_ID = "org.eclipse.cdt.dsf.gdb.GdbServerDebugger";//$NON-NLS-1$
|
private final static String REMOTE_DEBUGGER_ID = "org.eclipse.cdt.dsf.gdb.GdbServerDebugger";//$NON-NLS-1$
|
||||||
|
|
||||||
protected boolean fAttachMode = false;
|
protected boolean fAttachMode = false;
|
||||||
protected boolean fRemoteMode = false;
|
protected boolean fRemoteMode = false;
|
||||||
|
protected boolean fCoreMode = false;
|
||||||
|
|
||||||
protected Button fStopInMain;
|
protected Button fStopInMain;
|
||||||
protected Text fStopInMainSymbol;
|
protected Text fStopInMainSymbol;
|
||||||
|
@ -84,7 +79,11 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
private Composite fContents;
|
private Composite fContents;
|
||||||
|
|
||||||
public CDebuggerTab(SessionType sessionType, boolean attach) {
|
public CDebuggerTab(SessionType sessionType, boolean attach) {
|
||||||
if (sessionType == SessionType.REMOTE) fRemoteMode = true;
|
if (sessionType == SessionType.REMOTE) {
|
||||||
|
fRemoteMode = true;
|
||||||
|
} else if (sessionType == SessionType.CORE) {
|
||||||
|
fCoreMode = true;
|
||||||
|
}
|
||||||
fAttachMode = attach;
|
fAttachMode = attach;
|
||||||
|
|
||||||
ICDebugConfiguration dc = CDebugCorePlugin.getDefault().getDefaultDefaultDebugConfiguration();
|
ICDebugConfiguration dc = CDebugCorePlugin.getDefault().getDefaultDefaultDebugConfiguration();
|
||||||
|
@ -125,7 +124,6 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void loadDebuggerComboBox(ILaunchConfiguration config, String selection) {
|
protected void loadDebuggerComboBox(ILaunchConfiguration config, String selection) {
|
||||||
// String configPlatform = getPlatform(config);
|
|
||||||
ICDebugConfiguration[] debugConfigs = CDebugCorePlugin.getDefault().getActiveDebugConfigurations();
|
ICDebugConfiguration[] debugConfigs = CDebugCorePlugin.getDefault().getActiveDebugConfigurations();
|
||||||
Arrays.sort(debugConfigs, new Comparator<ICDebugConfiguration>() {
|
Arrays.sort(debugConfigs, new Comparator<ICDebugConfiguration>() {
|
||||||
public int compare(ICDebugConfiguration c1, ICDebugConfiguration c2) {
|
public int compare(ICDebugConfiguration c1, ICDebugConfiguration c2) {
|
||||||
|
@ -144,17 +142,12 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
}
|
}
|
||||||
String defaultSelection = selection;
|
String defaultSelection = selection;
|
||||||
for (ICDebugConfiguration debugConfig: debugConfigs) {
|
for (ICDebugConfiguration debugConfig: debugConfigs) {
|
||||||
|
// Note that for an attach session, we don't know yet if the user will want to do a
|
||||||
|
// remote session. So, we must allow for the remote debugger even if fRemote is false,
|
||||||
|
// in the case of attach
|
||||||
if (((fRemoteMode || fAttachMode) && debugConfig.getID().equals(REMOTE_DEBUGGER_ID)) ||
|
if (((fRemoteMode || fAttachMode) && debugConfig.getID().equals(REMOTE_DEBUGGER_ID)) ||
|
||||||
(!fRemoteMode && debugConfig.getID().equals(LOCAL_DEBUGGER_ID))) {
|
(!fRemoteMode && debugConfig.getID().equals(LOCAL_DEBUGGER_ID))) {
|
||||||
// String debuggerPlatform = debugConfig.getPlatform();
|
|
||||||
// if (validatePlatform(config, debugConfig)) {
|
|
||||||
list.add(debugConfig);
|
list.add(debugConfig);
|
||||||
// // select first exact matching debugger for platform or
|
|
||||||
// // requested selection
|
|
||||||
// if ((defaultSelection.equals("") && debuggerPlatform.equalsIgnoreCase(configPlatform))) { //$NON-NLS-1$
|
|
||||||
// defaultSelection = debugConfig.getID();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if no selection meaning nothing in config the force initdefault on tab
|
// if no selection meaning nothing in config the force initdefault on tab
|
||||||
|
@ -180,12 +173,15 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
} else if (fRemoteMode) {
|
} else if (fRemoteMode) {
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
||||||
IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE);
|
IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE);
|
||||||
|
} else if (fCoreMode){
|
||||||
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
||||||
|
ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE);
|
||||||
} else {
|
} else {
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
||||||
ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN);
|
ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fAttachMode) {
|
if (!fAttachMode && !fCoreMode) {
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN,
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN,
|
||||||
ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT);
|
ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT);
|
||||||
}
|
}
|
||||||
|
@ -252,16 +248,18 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
} else if (fRemoteMode) {
|
} else if (fRemoteMode) {
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
||||||
IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE);
|
IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE);
|
||||||
|
} else if (fCoreMode){
|
||||||
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
||||||
|
ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE);
|
||||||
} else {
|
} else {
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
|
||||||
ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN);
|
ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN);
|
||||||
}
|
}
|
||||||
if (!fAttachMode) {
|
if (!fAttachMode && !fCoreMode) {
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN,
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN,
|
||||||
fStopInMain.getSelection());
|
fStopInMain.getSelection());
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL,
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL,
|
||||||
fStopInMainSymbol.getText());
|
fStopInMainSymbol.getText());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,22 +268,6 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
if (!validateDebuggerConfig(config)) {
|
if (!validateDebuggerConfig(config)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// ICDebugConfiguration debugConfig = getDebugConfig();
|
|
||||||
// if (fAttachMode && !debugConfig.supportsMode(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH)) {
|
|
||||||
// setErrorMessage(MessageFormat.format(LaunchMessages.getString("CDebuggerTab.Mode_not_supported"), //$NON-NLS-1$
|
|
||||||
// (Object[]) new String[]{ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH}));
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// if (fRemoteMode && !debugConfig.supportsMode(IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE)) {
|
|
||||||
// setErrorMessage(MessageFormat.format(LaunchMessages.getString("CDebuggerTab.Mode_not_supported"), //$NON-NLS-1$
|
|
||||||
// (Object[]) new String[]{IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE}));
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// if (!fAttachMode && !fRemoteMode && !debugConfig.supportsMode(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN)) {
|
|
||||||
// setErrorMessage(MessageFormat.format(LaunchMessages.getString("CDebuggerTab.Mode_not_supported"), //$NON-NLS-1$
|
|
||||||
// (Object[]) new String[]{ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN}));
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
if (fStopInMain != null && fStopInMainSymbol != null) {
|
if (fStopInMain != null && fStopInMainSymbol != null) {
|
||||||
// The "Stop on startup at" field must not be empty
|
// The "Stop on startup at" field must not be empty
|
||||||
String mainSymbol = fStopInMainSymbol.getText().trim();
|
String mainSymbol = fStopInMainSymbol.getText().trim();
|
||||||
|
@ -300,54 +282,6 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean validatePlatform(ILaunchConfiguration config, ICDebugConfiguration debugConfig) {
|
|
||||||
String configPlatform = getPlatform(config);
|
|
||||||
String debuggerPlatform = debugConfig.getPlatform();
|
|
||||||
return (debuggerPlatform.equals("*") || debuggerPlatform.equalsIgnoreCase(configPlatform)); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
protected IBinaryObject getBinary(ILaunchConfiguration config) throws CoreException {
|
|
||||||
String programName = null;
|
|
||||||
String projectName = null;
|
|
||||||
try {
|
|
||||||
projectName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null);
|
|
||||||
programName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, (String)null);
|
|
||||||
} catch (CoreException e) {
|
|
||||||
}
|
|
||||||
if (programName != null) {
|
|
||||||
IPath exePath = new Path(programName);
|
|
||||||
if (projectName != null && !projectName.equals("")) { //$NON-NLS-1$
|
|
||||||
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
|
|
||||||
if (!project.isAccessible()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (!exePath.isAbsolute()) {
|
|
||||||
exePath = project.getLocation().append(exePath);
|
|
||||||
}
|
|
||||||
ICExtensionReference[] parserRef = CCorePlugin.getDefault().getBinaryParserExtensions(project);
|
|
||||||
for (int i = 0; i < parserRef.length; i++) {
|
|
||||||
try {
|
|
||||||
IBinaryParser parser = (IBinaryParser)parserRef[i].createExtension();
|
|
||||||
IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath);
|
|
||||||
if (exe != null) {
|
|
||||||
return exe;
|
|
||||||
}
|
|
||||||
} catch (ClassCastException e) {
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
IBinaryParser parser = CCorePlugin.getDefault().getDefaultBinaryParser();
|
|
||||||
try {
|
|
||||||
IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath);
|
|
||||||
return exe;
|
|
||||||
} catch (ClassCastException e) {
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean validateDebuggerConfig(ILaunchConfiguration config) {
|
protected boolean validateDebuggerConfig(ILaunchConfiguration config) {
|
||||||
ICDebugConfiguration debugConfig = getDebugConfig();
|
ICDebugConfiguration debugConfig = getDebugConfig();
|
||||||
if (debugConfig == null) {
|
if (debugConfig == null) {
|
||||||
|
@ -375,7 +309,7 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
GridLayout layout = new GridLayout(numberOfColumns, false);
|
GridLayout layout = new GridLayout(numberOfColumns, false);
|
||||||
optionsComp.setLayout(layout);
|
optionsComp.setLayout(layout);
|
||||||
optionsComp.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, true, false, 1, 1));
|
optionsComp.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, true, false, 1, 1));
|
||||||
if (!fAttachMode) {
|
if (!fAttachMode && !fCoreMode) {
|
||||||
fStopInMain = createCheckButton(optionsComp, LaunchMessages.getString("CDebuggerTab.Stop_at_main_on_startup")); //$NON-NLS-1$
|
fStopInMain = createCheckButton(optionsComp, LaunchMessages.getString("CDebuggerTab.Stop_at_main_on_startup")); //$NON-NLS-1$
|
||||||
fStopInMain.addSelectionListener(new SelectionAdapter() {
|
fStopInMain.addSelectionListener(new SelectionAdapter() {
|
||||||
|
|
||||||
|
@ -425,13 +359,13 @@ public class CDebuggerTab extends AbstractCDebuggerTab {
|
||||||
|
|
||||||
protected void initializeCommonControls(ILaunchConfiguration config) {
|
protected void initializeCommonControls(ILaunchConfiguration config) {
|
||||||
try {
|
try {
|
||||||
if (!fAttachMode) {
|
if (!fAttachMode && !fCoreMode) {
|
||||||
fStopInMain.setSelection(config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN,
|
fStopInMain.setSelection(config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN,
|
||||||
ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT));
|
ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT));
|
||||||
fStopInMainSymbol.setText(config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL,
|
fStopInMainSymbol.setText(config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL,
|
||||||
ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT));
|
ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT));
|
||||||
fStopInMainSymbol.setEnabled(fStopInMain.getSelection());
|
fStopInMainSymbol.setEnabled(fStopInMain.getSelection());
|
||||||
} else {
|
} else if (fAttachMode) {
|
||||||
// In attach mode, figure out if we are doing a remote connect based on the currently
|
// In attach mode, figure out if we are doing a remote connect based on the currently
|
||||||
// chosen debugger
|
// chosen debugger
|
||||||
if (getDebugConfig().getID().equals(REMOTE_DEBUGGER_ID)) fRemoteMode = true;
|
if (getDebugConfig().getID().equals(REMOTE_DEBUGGER_ID)) fRemoteMode = true;
|
||||||
|
|
|
@ -18,6 +18,6 @@ package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
|
||||||
*/
|
*/
|
||||||
public class CMainAttachTab extends CMainTab {
|
public class CMainAttachTab extends CMainTab {
|
||||||
public CMainAttachTab() {
|
public CMainAttachTab() {
|
||||||
super(2);// In some case, we don't need to specify an executable
|
super(CMainTab.DONT_CHECK_PROGRAM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2009 Ericsson and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Ericsson - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main tab to use for an attach launch configuration.
|
||||||
|
*
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
public class CMainCoreTab extends CMainTab {
|
||||||
|
public CMainCoreTab() {
|
||||||
|
super(CMainTab.SPECIFY_CORE_FILE);
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,7 +29,6 @@ import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
|
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
|
||||||
import org.eclipse.cdt.dsf.gdb.launching.LaunchMessages;
|
import org.eclipse.cdt.dsf.gdb.launching.LaunchMessages;
|
||||||
import org.eclipse.cdt.ui.CElementLabelProvider;
|
import org.eclipse.cdt.ui.CElementLabelProvider;
|
||||||
import org.eclipse.cdt.utils.pty.PTY;
|
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
@ -78,7 +77,7 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
*
|
*
|
||||||
* @since 2.0
|
* @since 2.0
|
||||||
*/
|
*/
|
||||||
public static final String TAB_ID = "org.eclipse.cdt.dsf.gdb.launch.mainTab";
|
public static final String TAB_ID = "org.eclipse.cdt.dsf.gdb.launch.mainTab"; //$NON-NLS-1$
|
||||||
|
|
||||||
// Project UI widgets
|
// Project UI widgets
|
||||||
protected Label fProjLabel;
|
protected Label fProjLabel;
|
||||||
|
@ -90,29 +89,28 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
protected Text fProgText;
|
protected Text fProgText;
|
||||||
protected Button fSearchButton;
|
protected Button fSearchButton;
|
||||||
|
|
||||||
private final boolean fWantsTerminalOption;
|
// Core file UI widgets
|
||||||
protected Button fTerminalButton;
|
protected Label fCoreLabel;
|
||||||
|
protected Text fCoreText;
|
||||||
|
protected Button fCoreButton;
|
||||||
|
|
||||||
private final boolean dontCheckProgram;
|
private final boolean fDontCheckProgram;
|
||||||
|
private final boolean fSpecifyCoreFile;
|
||||||
|
|
||||||
protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
|
protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
|
||||||
|
|
||||||
private String filterPlatform = EMPTY_STRING;
|
private String filterPlatform = EMPTY_STRING;
|
||||||
|
|
||||||
public static final int WANTS_TERMINAL = 1;
|
|
||||||
public static final int DONT_CHECK_PROGRAM = 2;
|
public static final int DONT_CHECK_PROGRAM = 2;
|
||||||
|
public static final int SPECIFY_CORE_FILE = 4;
|
||||||
|
|
||||||
public CMainTab() {
|
public CMainTab() {
|
||||||
this(0);
|
this(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CMainTab(boolean terminalOption) {
|
|
||||||
this(terminalOption ? WANTS_TERMINAL : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CMainTab(int flags) {
|
public CMainTab(int flags) {
|
||||||
fWantsTerminalOption = (flags & WANTS_TERMINAL) != 0;
|
fDontCheckProgram = (flags & DONT_CHECK_PROGRAM) != 0;
|
||||||
dontCheckProgram = (flags & DONT_CHECK_PROGRAM) != 0;
|
fSpecifyCoreFile = (flags & SPECIFY_CORE_FILE) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -133,9 +131,10 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
createProjectGroup(comp, 1);
|
createProjectGroup(comp, 1);
|
||||||
createExeFileGroup(comp, 1);
|
createExeFileGroup(comp, 1);
|
||||||
createVerticalSpacer(comp, 1);
|
createVerticalSpacer(comp, 1);
|
||||||
if (wantsTerminalOption() /* && ProcessFactory.supportesTerminal() */) {
|
if (fSpecifyCoreFile) {
|
||||||
createTerminalOption(comp, 1);
|
createCoreFileGroup(comp, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
GdbUIPlugin.setDialogShell(parent.getShell());
|
GdbUIPlugin.setDialogShell(parent.getShell());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,41 +209,57 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Button fBrowseForBinaryButton;
|
Button browseForBinaryButton;
|
||||||
fBrowseForBinaryButton = createPushButton(mainComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$
|
browseForBinaryButton = createPushButton(mainComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$
|
||||||
fBrowseForBinaryButton.addSelectionListener(new SelectionAdapter() {
|
browseForBinaryButton.addSelectionListener(new SelectionAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void widgetSelected(SelectionEvent evt) {
|
public void widgetSelected(SelectionEvent evt) {
|
||||||
handleBinaryBrowseButtonSelected();
|
String text = handleBrowseButtonSelected();
|
||||||
|
if (text != null) {
|
||||||
|
fProgText.setText(text);
|
||||||
|
}
|
||||||
updateLaunchConfigurationDialog();
|
updateLaunchConfigurationDialog();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean wantsTerminalOption() {
|
/** @since 2.0 */
|
||||||
return fWantsTerminalOption;
|
protected void createCoreFileGroup(Composite parent, int colSpan) {
|
||||||
}
|
Composite coreComp = new Composite(parent, SWT.NONE);
|
||||||
|
GridLayout coreLayout = new GridLayout();
|
||||||
protected void createTerminalOption(Composite parent, int colSpan) {
|
coreLayout.numColumns = 3;
|
||||||
Composite mainComp = new Composite(parent, SWT.NONE);
|
coreLayout.marginHeight = 0;
|
||||||
GridLayout mainLayout = new GridLayout();
|
coreLayout.marginWidth = 0;
|
||||||
mainLayout.numColumns = 1;
|
coreComp.setLayout(coreLayout);
|
||||||
mainLayout.marginHeight = 0;
|
|
||||||
mainLayout.marginWidth = 0;
|
|
||||||
mainComp.setLayout(mainLayout);
|
|
||||||
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
|
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
gd.horizontalSpan = colSpan;
|
gd.horizontalSpan = colSpan;
|
||||||
mainComp.setLayoutData(gd);
|
coreComp.setLayoutData(gd);
|
||||||
|
fCoreLabel = new Label(coreComp, SWT.NONE);
|
||||||
fTerminalButton = createCheckButton(mainComp, LaunchMessages.getString("CMainTab.UseTerminal")); //$NON-NLS-1$
|
fCoreLabel.setText(LaunchMessages.getString("CMainTab.CoreFile_path")); //$NON-NLS-1$
|
||||||
fTerminalButton.addSelectionListener(new SelectionAdapter() {
|
gd = new GridData();
|
||||||
|
gd.horizontalSpan = 3;
|
||||||
@Override
|
fCoreLabel.setLayoutData(gd);
|
||||||
public void widgetSelected(SelectionEvent evt) {
|
fCoreText = new Text(coreComp, SWT.SINGLE | SWT.BORDER);
|
||||||
|
gd = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
fCoreText.setLayoutData(gd);
|
||||||
|
fCoreText.addModifyListener(new ModifyListener() {
|
||||||
|
public void modifyText(ModifyEvent evt) {
|
||||||
|
updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Button browseForCoreButton;
|
||||||
|
browseForCoreButton = createPushButton(coreComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$
|
||||||
|
browseForCoreButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent evt) {
|
||||||
|
String text = handleBrowseButtonSelected();
|
||||||
|
if (text != null) {
|
||||||
|
fCoreText.setText(text);
|
||||||
|
}
|
||||||
updateLaunchConfigurationDialog();
|
updateLaunchConfigurationDialog();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
fTerminalButton.setEnabled(PTY.isSupported());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -256,19 +271,7 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
filterPlatform = getPlatform(config);
|
filterPlatform = getPlatform(config);
|
||||||
updateProjectFromConfig(config);
|
updateProjectFromConfig(config);
|
||||||
updateProgramFromConfig(config);
|
updateProgramFromConfig(config);
|
||||||
updateTerminalFromConfig(config);
|
updateCoreFromConfig(config);
|
||||||
}
|
|
||||||
|
|
||||||
protected void updateTerminalFromConfig(ILaunchConfiguration config) {
|
|
||||||
if (fTerminalButton != null) {
|
|
||||||
boolean useTerminal = true;
|
|
||||||
try {
|
|
||||||
useTerminal = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, ICDTLaunchConfigurationConstants.USE_TERMINAL_DEFAULT);
|
|
||||||
} catch (CoreException e) {
|
|
||||||
GdbUIPlugin.log(e);
|
|
||||||
}
|
|
||||||
fTerminalButton.setSelection(useTerminal);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateProjectFromConfig(ILaunchConfiguration config) {
|
protected void updateProjectFromConfig(ILaunchConfiguration config) {
|
||||||
|
@ -290,6 +293,19 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
}
|
}
|
||||||
fProgText.setText(programName);
|
fProgText.setText(programName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @since 2.0 */
|
||||||
|
protected void updateCoreFromConfig(ILaunchConfiguration config) {
|
||||||
|
if (fCoreText != null) {
|
||||||
|
String coreName = EMPTY_STRING;
|
||||||
|
try {
|
||||||
|
coreName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, EMPTY_STRING);
|
||||||
|
} catch (CoreException ce) {
|
||||||
|
GdbUIPlugin.log(ce);
|
||||||
|
}
|
||||||
|
fCoreText.setText(coreName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
|
@ -318,8 +334,8 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
|
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText());
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText());
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, fProgText.getText());
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, fProgText.getText());
|
||||||
if (fTerminalButton != null) {
|
if (fCoreText != null) {
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, fTerminalButton.getSelection());
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, fCoreText.getText());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -397,23 +413,12 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show a dialog that lets the user select a project. This in turn provides context for the main
|
* Show a dialog that lets the user select a file.
|
||||||
* type, allowing the user to key a main type name, or constraining the search for main types to
|
|
||||||
* the specified project.
|
|
||||||
*/
|
*/
|
||||||
protected void handleBinaryBrowseButtonSelected() {
|
protected String handleBrowseButtonSelected() {
|
||||||
final ICProject cproject = getCProject();
|
|
||||||
if (cproject == null) {
|
|
||||||
MessageDialog.openInformation(getShell(), LaunchMessages.getString("CMainTab.Project_required"), //$NON-NLS-1$
|
|
||||||
LaunchMessages.getString("CMainTab.Enter_project_before_browsing_for_program")); //$NON-NLS-1$
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
|
FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
|
||||||
fileDialog.setFileName(fProgText.getText());
|
fileDialog.setFileName(fProgText.getText());
|
||||||
String text= fileDialog.open();
|
return fileDialog.open();
|
||||||
if (text != null) {
|
|
||||||
fProgText.setText(text);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -537,57 +542,73 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
setErrorMessage(null);
|
setErrorMessage(null);
|
||||||
setMessage(null);
|
setMessage(null);
|
||||||
|
|
||||||
if (dontCheckProgram)
|
if (!fDontCheckProgram) {
|
||||||
return true;
|
String name = fProjText.getText().trim();
|
||||||
|
if (name.length() == 0) {
|
||||||
|
setErrorMessage(LaunchMessages.getString("CMainTab.Project_not_specified")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!ResourcesPlugin.getWorkspace().getRoot().getProject(name).exists()) {
|
||||||
|
setErrorMessage(LaunchMessages.getString("Launch.common.Project_does_not_exist")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
|
||||||
|
if (!project.isOpen()) {
|
||||||
|
setErrorMessage(LaunchMessages.getString("CMainTab.Project_must_be_opened")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
String name = fProjText.getText().trim();
|
name = fProgText.getText().trim();
|
||||||
if (name.length() == 0) {
|
if (name.length() == 0) {
|
||||||
setErrorMessage(LaunchMessages.getString("CMainTab.Project_not_specified")); //$NON-NLS-1$
|
setErrorMessage(LaunchMessages.getString("CMainTab.Program_not_specified")); //$NON-NLS-1$
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ResourcesPlugin.getWorkspace().getRoot().getProject(name).exists()) {
|
if (name.equals(".") || name.equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
setErrorMessage(LaunchMessages.getString("Launch.common.Project_does_not_exist")); //$NON-NLS-1$
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
|
|
||||||
if (!project.isOpen()) {
|
|
||||||
setErrorMessage(LaunchMessages.getString("CMainTab.Project_must_be_opened")); //$NON-NLS-1$
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
name = fProgText.getText().trim();
|
|
||||||
if (name.length() == 0) {
|
|
||||||
setErrorMessage(LaunchMessages.getString("CMainTab.Program_not_specified")); //$NON-NLS-1$
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (name.equals(".") || name.equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
setErrorMessage(LaunchMessages.getString("CMainTab.Program_does_not_exist")); //$NON-NLS-1$
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
IPath exePath = new Path(name);
|
|
||||||
if (!exePath.isAbsolute()) {
|
|
||||||
if (!project.getFile(name).exists()) {
|
|
||||||
setErrorMessage(LaunchMessages.getString("CMainTab.Program_does_not_exist")); //$NON-NLS-1$
|
setErrorMessage(LaunchMessages.getString("CMainTab.Program_does_not_exist")); //$NON-NLS-1$
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
exePath = project.getFile(name).getLocation();
|
IPath exePath = new Path(name);
|
||||||
} else {
|
if (!exePath.isAbsolute()) {
|
||||||
if (!exePath.toFile().exists()) {
|
if (!project.getFile(name).exists()) {
|
||||||
setErrorMessage(LaunchMessages.getString("CMainTab.Program_does_not_exist")); //$NON-NLS-1$
|
setErrorMessage(LaunchMessages.getString("CMainTab.Program_does_not_exist")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
exePath = project.getFile(name).getLocation();
|
||||||
|
} else {
|
||||||
|
if (!exePath.toFile().exists()) {
|
||||||
|
setErrorMessage(LaunchMessages.getString("CMainTab.Program_does_not_exist")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (!isBinary(project, exePath)) {
|
||||||
|
setErrorMessage(LaunchMessages.getString("CMainTab.Program_is_not_a_recongnized_executable")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
GdbUIPlugin.log(e);
|
||||||
|
setErrorMessage(e.getLocalizedMessage());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
if (!isBinary(project, exePath)) {
|
|
||||||
setErrorMessage(LaunchMessages.getString("CMainTab.Program_is_not_a_recongnized_executable")); //$NON-NLS-1$
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} catch (CoreException e) {
|
|
||||||
GdbUIPlugin.log(e);
|
|
||||||
setErrorMessage(e.getLocalizedMessage());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (fCoreText != null) {
|
||||||
|
String coreName = fCoreText.getText().trim();
|
||||||
|
// We accept an empty string. This should trigger a prompt to the user
|
||||||
|
// This allows to re-use the launch, with a different core file.
|
||||||
|
if (!coreName.equals(EMPTY_STRING)) {
|
||||||
|
if (coreName.equals(".") || coreName.equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
setErrorMessage(LaunchMessages.getString("CMainTab.Core_does_not_exist")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
IPath corePath = new Path(coreName);
|
||||||
|
if (!corePath.toFile().exists()) {
|
||||||
|
setErrorMessage(LaunchMessages.getString("CMainTab.Core_does_not_exist")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -625,25 +646,21 @@ public class CMainTab extends CLaunchConfigurationTab {
|
||||||
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
|
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
|
||||||
*/
|
*/
|
||||||
public void setDefaults(ILaunchConfigurationWorkingCopy config) {
|
public void setDefaults(ILaunchConfigurationWorkingCopy config) {
|
||||||
// We set empty attributes for project & program so that when one config
|
// We set empty attributes for project & program so that when one config is
|
||||||
// is
|
// compared to another, the existence of empty attributes doesn't cause and
|
||||||
// compared to another, the existence of empty attributes doesn't cause
|
// incorrect result (the performApply() method can result in empty values
|
||||||
// an
|
|
||||||
// incorrect result (the performApply() method can result in empty
|
|
||||||
// values
|
|
||||||
// for these attributes being set on a config if there is nothing in the
|
// for these attributes being set on a config if there is nothing in the
|
||||||
// corresponding text boxes)
|
// corresponding text boxes)
|
||||||
// plus getContext will use this to base context from if set.
|
// plus getContext will use this to base context from if set.
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING);
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING);
|
||||||
|
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, EMPTY_STRING);
|
||||||
|
|
||||||
ICElement cElement = null;
|
ICElement cElement = null;
|
||||||
cElement = getContext(config, getPlatform(config));
|
cElement = getContext(config, getPlatform(config));
|
||||||
if (cElement != null) {
|
if (cElement != null) {
|
||||||
initializeCProject(cElement, config);
|
initializeCProject(cElement, config);
|
||||||
initializeProgramName(cElement, config);
|
initializeProgramName(cElement, config);
|
||||||
}
|
}
|
||||||
if (wantsTerminalOption()) {
|
|
||||||
config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, ICDTLaunchConfigurationConstants.USE_TERMINAL_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2009 Ericsson and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Ericsson - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.ICDebugConfiguration;
|
||||||
|
import org.eclipse.cdt.debug.ui.ICDebuggerPage;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.service.SessionType;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
public class CoreFileDebuggerTab extends CDebuggerTab {
|
||||||
|
public CoreFileDebuggerTab() {
|
||||||
|
super(SessionType.CORE, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void loadDynamicDebugArea() {
|
||||||
|
// Dispose of any current child widgets in the tab holder area
|
||||||
|
Control[] children = getDynamicTabHolder().getChildren();
|
||||||
|
for (int i = 0; i < children.length; i++) {
|
||||||
|
children[i].dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
ICDebugConfiguration debugConfig = getConfigForCurrentDebugger();
|
||||||
|
if (debugConfig == null) {
|
||||||
|
setDynamicTab(null);
|
||||||
|
} else {
|
||||||
|
ICDebuggerPage tab = new GdbCoreDebuggerPage();
|
||||||
|
setDynamicTab(tab);
|
||||||
|
}
|
||||||
|
setDebugConfig(debugConfig);
|
||||||
|
|
||||||
|
if (getDynamicTab() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Ask the dynamic UI to create its Control
|
||||||
|
getDynamicTab().setLaunchConfigurationDialog(getLaunchConfigurationDialog());
|
||||||
|
getDynamicTab().createControl(getDynamicTabHolder());
|
||||||
|
getDynamicTab().getControl().setVisible(true);
|
||||||
|
getDynamicTabHolder().layout(true);
|
||||||
|
contentsChanged();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2009 Ericsson and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Ericsson - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.launching.LaunchMessages;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.IStatusHandler;
|
||||||
|
import org.eclipse.jface.dialogs.ErrorDialog;
|
||||||
|
import org.eclipse.swt.widgets.FileDialog;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
public class CoreFilePrompter implements IStatusHandler {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus,
|
||||||
|
* java.lang.Object)
|
||||||
|
*/
|
||||||
|
public Object handleStatus(IStatus status, Object params) throws CoreException {
|
||||||
|
final Shell shell = GdbUIPlugin.getShell();
|
||||||
|
if (shell == null) {
|
||||||
|
IStatus error = new Status(IStatus.ERROR, GdbUIPlugin.getUniqueIdentifier(),
|
||||||
|
ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR,
|
||||||
|
LaunchMessages.getString("CoreFileLaunchDelegate.No_Shell_available_in_Launch"), null); //$NON-NLS-1$
|
||||||
|
throw new CoreException(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileDialog dialog = new FileDialog(shell);
|
||||||
|
dialog.setText(LaunchMessages.getString("CoreFileLaunchDelegate.Select_Corefile")); //$NON-NLS-1$
|
||||||
|
String res = dialog.open();
|
||||||
|
if (res != null) {
|
||||||
|
File file = new File(res);
|
||||||
|
if (!file.exists() || !file.canRead()) {
|
||||||
|
ErrorDialog.openError(shell, LaunchMessages.getString("CoreFileLaunchDelegate.postmortem_debugging_failed"), //$NON-NLS-1$
|
||||||
|
LaunchMessages.getString("CoreFileLaunchDelegate.Corefile_not_accessible"), //$NON-NLS-1$
|
||||||
|
new Status(IStatus.ERROR, GdbUIPlugin.getUniqueIdentifier(),
|
||||||
|
ICDTLaunchConfigurationConstants.ERR_NO_COREFILE,
|
||||||
|
LaunchMessages.getString("CoreFileLaunchDelegate.Corefile_not_readable"), null)); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,302 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2009 Ericsson and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Ericsson - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Observable;
|
||||||
|
import java.util.Observer;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.ui.AbstractCDebuggerPage;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
|
||||||
|
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.ModifyEvent;
|
||||||
|
import org.eclipse.swt.events.ModifyListener;
|
||||||
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.FileDialog;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.swt.widgets.TabFolder;
|
||||||
|
import org.eclipse.swt.widgets.TabItem;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The dynamic tab for gdb-based debugger implementations that do post mortem debugging.
|
||||||
|
* It is the same as the GdbDebuggerPage class without non-stop or reverse check boxes.
|
||||||
|
*
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
public class GdbCoreDebuggerPage extends AbstractCDebuggerPage implements Observer {
|
||||||
|
|
||||||
|
protected TabFolder fTabFolder;
|
||||||
|
protected Text fGDBCommandText;
|
||||||
|
protected Text fGDBInitText;
|
||||||
|
|
||||||
|
private IMILaunchConfigurationComponent fSolibBlock;
|
||||||
|
private boolean fIsInitializing = false;
|
||||||
|
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
Composite comp = new Composite(parent, SWT.NONE);
|
||||||
|
comp.setLayout(new GridLayout());
|
||||||
|
comp.setLayoutData(new GridData(GridData.FILL_BOTH));
|
||||||
|
fTabFolder = new TabFolder(comp, SWT.NONE);
|
||||||
|
fTabFolder.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL));
|
||||||
|
createTabs(fTabFolder);
|
||||||
|
fTabFolder.setSelection(0);
|
||||||
|
setControl(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
|
||||||
|
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUG_NAME,
|
||||||
|
IGDBLaunchConfigurationConstants.DEBUGGER_DEBUG_NAME_DEFAULT);
|
||||||
|
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
|
||||||
|
IGDBLaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT);
|
||||||
|
|
||||||
|
if (fSolibBlock != null)
|
||||||
|
fSolibBlock.setDefaults(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isValid(ILaunchConfiguration launchConfig) {
|
||||||
|
boolean valid = fGDBCommandText.getText().length() != 0;
|
||||||
|
if (valid) {
|
||||||
|
setErrorMessage(null);
|
||||||
|
setMessage(null);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setErrorMessage(LaunchUIMessages.getString("GDBDebuggerPage.0")); //$NON-NLS-1$
|
||||||
|
setMessage(null);
|
||||||
|
}
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeFrom(ILaunchConfiguration configuration) {
|
||||||
|
setInitializing(true);
|
||||||
|
String gdbCommand = IGDBLaunchConfigurationConstants.DEBUGGER_DEBUG_NAME_DEFAULT;
|
||||||
|
String gdbInit = IGDBLaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT;
|
||||||
|
|
||||||
|
try {
|
||||||
|
gdbCommand = configuration.getAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUG_NAME,
|
||||||
|
IGDBLaunchConfigurationConstants.DEBUGGER_DEBUG_NAME_DEFAULT);
|
||||||
|
}
|
||||||
|
catch(CoreException e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
gdbInit = configuration.getAttribute(IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
|
||||||
|
IGDBLaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT);
|
||||||
|
}
|
||||||
|
catch(CoreException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (fSolibBlock != null)
|
||||||
|
fSolibBlock.initializeFrom(configuration);
|
||||||
|
fGDBCommandText.setText(gdbCommand);
|
||||||
|
fGDBInitText.setText(gdbInit);
|
||||||
|
|
||||||
|
setInitializing(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
|
||||||
|
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUG_NAME,
|
||||||
|
fGDBCommandText.getText().trim());
|
||||||
|
configuration.setAttribute(IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
|
||||||
|
fGDBInitText.getText().trim());
|
||||||
|
|
||||||
|
if (fSolibBlock != null)
|
||||||
|
fSolibBlock.performApply(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return LaunchUIMessages.getString("GDBDebuggerPage.1"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getShell()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Shell getShell() {
|
||||||
|
return super.getShell();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void updateLaunchConfigurationDialog() {
|
||||||
|
super.updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
|
||||||
|
*/
|
||||||
|
public void update(Observable o, Object arg) {
|
||||||
|
if (!isInitializing())
|
||||||
|
updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMILaunchConfigurationComponent createSolibBlock(Composite parent) {
|
||||||
|
IMILaunchConfigurationComponent block = new GDBSolibBlock( new SolibSearchPathBlock(), true, true);
|
||||||
|
block.createControl(parent);
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTabs(TabFolder tabFolder) {
|
||||||
|
createMainTab(tabFolder);
|
||||||
|
createSolibTab(tabFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createMainTab(TabFolder tabFolder) {
|
||||||
|
TabItem tabItem = new TabItem(tabFolder, SWT.NONE);
|
||||||
|
tabItem.setText(LaunchUIMessages.getString("GDBDebuggerPage.2")); //$NON-NLS-1$
|
||||||
|
Composite comp = ControlFactory.createCompositeEx(tabFolder, 1, GridData.FILL_BOTH);
|
||||||
|
((GridLayout)comp.getLayout()).makeColumnsEqualWidth = false;
|
||||||
|
comp.setFont(tabFolder.getFont());
|
||||||
|
tabItem.setControl(comp);
|
||||||
|
Composite subComp = ControlFactory.createCompositeEx(comp, 3, GridData.FILL_HORIZONTAL);
|
||||||
|
((GridLayout)subComp.getLayout()).makeColumnsEqualWidth = false;
|
||||||
|
subComp.setFont(tabFolder.getFont());
|
||||||
|
Label label = ControlFactory.createLabel(subComp, LaunchUIMessages.getString("GDBDebuggerPage.3")); //$NON-NLS-1$
|
||||||
|
GridData gd = new GridData();
|
||||||
|
// gd.horizontalSpan = 2;
|
||||||
|
label.setLayoutData(gd);
|
||||||
|
fGDBCommandText = ControlFactory.createTextField(subComp, SWT.SINGLE | SWT.BORDER);
|
||||||
|
fGDBCommandText.addModifyListener(new ModifyListener() {
|
||||||
|
|
||||||
|
public void modifyText(ModifyEvent evt) {
|
||||||
|
if (!isInitializing())
|
||||||
|
updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Button button = createPushButton(subComp, LaunchUIMessages.getString("GDBDebuggerPage.4"), null); //$NON-NLS-1$
|
||||||
|
button.addSelectionListener(new SelectionAdapter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent evt) {
|
||||||
|
handleGDBButtonSelected();
|
||||||
|
updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleGDBButtonSelected() {
|
||||||
|
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
|
||||||
|
dialog.setText(LaunchUIMessages.getString("GDBDebuggerPage.5")); //$NON-NLS-1$
|
||||||
|
String gdbCommand = fGDBCommandText.getText().trim();
|
||||||
|
int lastSeparatorIndex = gdbCommand.lastIndexOf(File.separator);
|
||||||
|
if (lastSeparatorIndex != -1) {
|
||||||
|
dialog.setFilterPath(gdbCommand.substring(0, lastSeparatorIndex));
|
||||||
|
}
|
||||||
|
String res = dialog.open();
|
||||||
|
if (res == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fGDBCommandText.setText(res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
label = ControlFactory.createLabel(subComp, LaunchUIMessages.getString("GDBDebuggerPage.6")); //$NON-NLS-1$
|
||||||
|
gd = new GridData();
|
||||||
|
// gd.horizontalSpan = 2;
|
||||||
|
label.setLayoutData(gd);
|
||||||
|
fGDBInitText = ControlFactory.createTextField(subComp, SWT.SINGLE | SWT.BORDER);
|
||||||
|
gd = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
fGDBInitText.setLayoutData(gd);
|
||||||
|
fGDBInitText.addModifyListener(new ModifyListener() {
|
||||||
|
|
||||||
|
public void modifyText(ModifyEvent evt) {
|
||||||
|
if (!isInitializing())
|
||||||
|
updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
button = createPushButton(subComp, LaunchUIMessages.getString("GDBDebuggerPage.7"), null); //$NON-NLS-1$
|
||||||
|
button.addSelectionListener(new SelectionAdapter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent evt) {
|
||||||
|
handleGDBInitButtonSelected();
|
||||||
|
updateLaunchConfigurationDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleGDBInitButtonSelected() {
|
||||||
|
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
|
||||||
|
dialog.setText(LaunchUIMessages.getString("GDBDebuggerPage.8")); //$NON-NLS-1$
|
||||||
|
String gdbCommand = fGDBInitText.getText().trim();
|
||||||
|
int lastSeparatorIndex = gdbCommand.lastIndexOf(File.separator);
|
||||||
|
if (lastSeparatorIndex != -1) {
|
||||||
|
dialog.setFilterPath(gdbCommand.substring(0, lastSeparatorIndex));
|
||||||
|
}
|
||||||
|
String res = dialog.open();
|
||||||
|
if (res == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fGDBInitText.setText(res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
label = ControlFactory.createLabel(subComp, LaunchUIMessages.getString("GDBDebuggerPage.9"), //$NON-NLS-1$
|
||||||
|
200, SWT.DEFAULT, SWT.WRAP);
|
||||||
|
|
||||||
|
gd = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
gd.horizontalSpan = 3;
|
||||||
|
gd.widthHint = 200;
|
||||||
|
label.setLayoutData(gd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createSolibTab(TabFolder tabFolder) {
|
||||||
|
TabItem tabItem = new TabItem(tabFolder, SWT.NONE);
|
||||||
|
tabItem.setText(LaunchUIMessages.getString("GDBDebuggerPage.10")); //$NON-NLS-1$
|
||||||
|
Composite comp = ControlFactory.createCompositeEx(fTabFolder, 1, GridData.FILL_BOTH);
|
||||||
|
comp.setFont(tabFolder.getFont());
|
||||||
|
tabItem.setControl(comp);
|
||||||
|
fSolibBlock = createSolibBlock(comp);
|
||||||
|
if (fSolibBlock instanceof Observable)
|
||||||
|
((Observable)fSolibBlock).addObserver(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
if (fSolibBlock != null) {
|
||||||
|
if (fSolibBlock instanceof Observable)
|
||||||
|
((Observable)fSolibBlock).deleteObserver(this);
|
||||||
|
fSolibBlock.dispose();
|
||||||
|
}
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
|
||||||
|
// Override the default behavior
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isInitializing() {
|
||||||
|
return fIsInitializing;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setInitializing(boolean isInitializing) {
|
||||||
|
fIsInitializing = isInitializing;
|
||||||
|
}
|
||||||
|
}
|
|
@ -34,6 +34,16 @@
|
||||||
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
|
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
|
||||||
sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer">
|
sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer">
|
||||||
</launchDelegate>
|
</launchDelegate>
|
||||||
|
<launchDelegate
|
||||||
|
id="org.eclipse.cdt.dsf.gdb.launch.coreCLaunch"
|
||||||
|
type="org.eclipse.cdt.launch.postmortemLaunchType"
|
||||||
|
modes="debug"
|
||||||
|
delegate="org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate"
|
||||||
|
name="GDB (DSF) Postmortem Debugger"
|
||||||
|
delegateDescription="Load an application dump under into the GDB debugger integrated using the Debugger Services Framework (DSF)."
|
||||||
|
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
|
||||||
|
sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer">
|
||||||
|
</launchDelegate>
|
||||||
</extension>
|
</extension>
|
||||||
|
|
||||||
<extension
|
<extension
|
||||||
|
|
|
@ -39,6 +39,7 @@ import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetAutoSolib;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetNonStop;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetNonStop;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetSolibSearchPath;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetSolibSearchPath;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelect;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelect;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelectCore;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.RawCommand;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.RawCommand;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||||
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
||||||
|
@ -47,6 +48,8 @@ import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.IStatusHandler;
|
||||||
|
|
||||||
public class FinalLaunchSequence extends Sequence {
|
public class FinalLaunchSequence extends Sequence {
|
||||||
|
|
||||||
|
@ -298,6 +301,61 @@ public class FinalLaunchSequence extends Sequence {
|
||||||
|
|
||||||
sourceLookup.setSourceLookupPath(sourceLookupDmc, locator.getSourceContainers(), requestMonitor);
|
sourceLookup.setSourceLookupPath(sourceLookupDmc, locator.getSourceContainers(), requestMonitor);
|
||||||
}},
|
}},
|
||||||
|
/*
|
||||||
|
* Specify the core file to be debugged if we are launching such a debug session.
|
||||||
|
*/
|
||||||
|
new Step() {
|
||||||
|
private String promptForCoreFilePath() throws CoreException {
|
||||||
|
IStatus promptStatus = new Status(IStatus.INFO, "org.eclipse.debug.ui", 200/*STATUS_HANDLER_PROMPT*/, "", null); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
IStatus filePrompt = new Status(IStatus.INFO, "org.eclipse.cdt.dsf.gdb.ui", 1001, "", null); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
// consult a status handler
|
||||||
|
IStatusHandler prompter = DebugPlugin.getDefault().getStatusHandler(promptStatus);
|
||||||
|
if (prompter != null) {
|
||||||
|
Object result = prompter.handleStatus(filePrompt, null);
|
||||||
|
if (result instanceof String) {
|
||||||
|
return (String)result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void execute(final RequestMonitor requestMonitor) {
|
||||||
|
if (fSessionType == SessionType.CORE) {
|
||||||
|
Exception exception = null;
|
||||||
|
String coreFile;
|
||||||
|
try {
|
||||||
|
coreFile = fLaunch.getLaunchConfiguration().getAttribute(ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, ""); //$NON-NLS-1$
|
||||||
|
|
||||||
|
if (coreFile != null) {
|
||||||
|
if (coreFile.length() == 0) {
|
||||||
|
coreFile = promptForCoreFilePath();
|
||||||
|
if (coreFile == null || coreFile.length()== 0) {
|
||||||
|
requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, "Cannot get core file path", exception)); //$NON-NLS-1$
|
||||||
|
requestMonitor.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fCommandControl.queueCommand(
|
||||||
|
new MITargetSelectCore(fCommandControl.getContext(), coreFile),
|
||||||
|
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
|
||||||
|
@Override
|
||||||
|
protected void handleSuccess() {
|
||||||
|
requestMonitor.done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
exception = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, "Cannot get core file path", exception)); //$NON-NLS-1$
|
||||||
|
requestMonitor.done();
|
||||||
|
} else {
|
||||||
|
requestMonitor.done();
|
||||||
|
}
|
||||||
|
}},
|
||||||
/*
|
/*
|
||||||
* If remote debugging, connect to target.
|
* If remote debugging, connect to target.
|
||||||
*/
|
*/
|
||||||
|
@ -429,10 +487,14 @@ public class FinalLaunchSequence extends Sequence {
|
||||||
*/
|
*/
|
||||||
new Step() { @Override
|
new Step() { @Override
|
||||||
public void execute(final RequestMonitor requestMonitor) {
|
public void execute(final RequestMonitor requestMonitor) {
|
||||||
MIBreakpointsManager bpmService = fTracker.getService(MIBreakpointsManager.class);
|
if (fSessionType != SessionType.CORE) {
|
||||||
IBreakpointsTargetDMContext breakpointDmc = (IBreakpointsTargetDMContext)fCommandControl.getContext();
|
MIBreakpointsManager bpmService = fTracker.getService(MIBreakpointsManager.class);
|
||||||
|
IBreakpointsTargetDMContext breakpointDmc = (IBreakpointsTargetDMContext)fCommandControl.getContext();
|
||||||
|
|
||||||
bpmService.startTrackingBreakpoints(breakpointDmc, requestMonitor);
|
bpmService.startTrackingBreakpoints(breakpointDmc, requestMonitor);
|
||||||
|
} else {
|
||||||
|
requestMonitor.done();
|
||||||
|
}
|
||||||
}},
|
}},
|
||||||
/*
|
/*
|
||||||
* Start the program.
|
* Start the program.
|
||||||
|
@ -440,7 +502,11 @@ public class FinalLaunchSequence extends Sequence {
|
||||||
new Step() {
|
new Step() {
|
||||||
@Override
|
@Override
|
||||||
public void execute(final RequestMonitor requestMonitor) {
|
public void execute(final RequestMonitor requestMonitor) {
|
||||||
fCommandControl.start(fLaunch, requestMonitor);
|
if (fSessionType != SessionType.CORE) {
|
||||||
|
fCommandControl.start(fLaunch, requestMonitor);
|
||||||
|
} else {
|
||||||
|
requestMonitor.done();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -98,6 +98,8 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate
|
||||||
|
|
||||||
if (sessionType == SessionType.REMOTE) {
|
if (sessionType == SessionType.REMOTE) {
|
||||||
monitor.subTask( "Debugging remote C/C++ application" );
|
monitor.subTask( "Debugging remote C/C++ application" );
|
||||||
|
} else if (sessionType == SessionType.CORE) {
|
||||||
|
monitor.subTask( "Post Mortem Debugging of C/C++ application" );
|
||||||
} else {
|
} else {
|
||||||
monitor.subTask( "Debugging local C/C++ application" );
|
monitor.subTask( "Debugging local C/C++ application" );
|
||||||
}
|
}
|
||||||
|
@ -161,7 +163,7 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate
|
||||||
|
|
||||||
// Add the CLI and "inferior" process objects to the launch.
|
// Add the CLI and "inferior" process objects to the launch.
|
||||||
launch.addCLIProcess("gdb"); //$NON-NLS-1$
|
launch.addCLIProcess("gdb"); //$NON-NLS-1$
|
||||||
if (!attach) {
|
if (!attach && sessionType != SessionType.CORE) {
|
||||||
launch.addInferiorProcess(exePath.lastSegment());
|
launch.addInferiorProcess(exePath.lastSegment());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,9 +85,11 @@ CMainTab.Project_not_specified=Project not specified
|
||||||
CMainTab.Program_not_specified=Program not specified
|
CMainTab.Program_not_specified=Program not specified
|
||||||
CMainTab.Project_must_be_opened=Project must be opened
|
CMainTab.Project_must_be_opened=Project must be opened
|
||||||
CMainTab.Program_does_not_exist=Program does not exist
|
CMainTab.Program_does_not_exist=Program does not exist
|
||||||
|
CMainTab.Core_does_not_exist=Core file does not exist
|
||||||
CMainTab.Main=Main
|
CMainTab.Main=Main
|
||||||
CMainTab.&ProjectColon=&Project:
|
CMainTab.&ProjectColon=&Project:
|
||||||
CMainTab.C/C++_Application=C/C++ Application:
|
CMainTab.C/C++_Application=C/C++ Application:
|
||||||
|
CMainTab.CoreFile_path=Core file (leave blank to trigger prompt:)
|
||||||
CMainTab.Search...=Searc&h Project...
|
CMainTab.Search...=Searc&h Project...
|
||||||
CMainTab.Choose_program_to_run=Choose a &program to run:
|
CMainTab.Choose_program_to_run=Choose a &program to run:
|
||||||
CMainTab.Choose_program_to_run_from_NAME=Choose a program to run from {0}:
|
CMainTab.Choose_program_to_run_from_NAME=Choose a program to run from {0}:
|
||||||
|
|
|
@ -151,8 +151,34 @@ public class GDBRunControl extends MIRunControl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void canResume(IExecutionDMContext context, DataRequestMonitor<Boolean> rm) {
|
||||||
|
if (fGdb.getSessionType() == SessionType.CORE) {
|
||||||
|
rm.setData(false);
|
||||||
|
rm.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
super.canResume(context, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void canSuspend(IExecutionDMContext context, DataRequestMonitor<Boolean> rm) {
|
||||||
|
if (fGdb.getSessionType() == SessionType.CORE) {
|
||||||
|
rm.setData(false);
|
||||||
|
rm.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
super.canSuspend(context, rm);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void canStep(final IExecutionDMContext context, StepType stepType, final DataRequestMonitor<Boolean> rm) {
|
public void canStep(final IExecutionDMContext context, StepType stepType, final DataRequestMonitor<Boolean> rm) {
|
||||||
|
if (fGdb.getSessionType() == SessionType.CORE) {
|
||||||
|
rm.setData(false);
|
||||||
|
rm.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (context instanceof IContainerDMContext) {
|
if (context instanceof IContainerDMContext) {
|
||||||
rm.setData(false);
|
rm.setData(false);
|
||||||
rm.done();
|
rm.done();
|
||||||
|
|
|
@ -71,6 +71,11 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
|
||||||
fGdb = getServicesTracker().getService(IGDBBackend.class);
|
fGdb = getServicesTracker().getService(IGDBBackend.class);
|
||||||
fProcService = getServicesTracker().getService(IMIProcesses.class);
|
fProcService = getServicesTracker().getService(IMIProcesses.class);
|
||||||
|
|
||||||
|
if (fGdb.getSessionType() == SessionType.CORE) {
|
||||||
|
// No execution for core files, so no support for reverse
|
||||||
|
fReverseSupported = false;
|
||||||
|
}
|
||||||
|
|
||||||
register(new String[]{IRunControl.class.getName(), MIRunControl.class.getName(),
|
register(new String[]{IRunControl.class.getName(), MIRunControl.class.getName(),
|
||||||
IReverseRunControl.class.getName()},
|
IReverseRunControl.class.getName()},
|
||||||
new Hashtable<String,String>());
|
new Hashtable<String,String>());
|
||||||
|
@ -131,8 +136,34 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
public void canResume(IExecutionDMContext context, DataRequestMonitor<Boolean> rm) {
|
||||||
|
if (fGdb.getSessionType() == SessionType.CORE) {
|
||||||
|
rm.setData(false);
|
||||||
|
rm.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
super.canResume(context, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void canSuspend(IExecutionDMContext context, DataRequestMonitor<Boolean> rm) {
|
||||||
|
if (fGdb.getSessionType() == SessionType.CORE) {
|
||||||
|
rm.setData(false);
|
||||||
|
rm.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
super.canSuspend(context, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void canStep(final IExecutionDMContext context, StepType stepType, final DataRequestMonitor<Boolean> rm) {
|
public void canStep(final IExecutionDMContext context, StepType stepType, final DataRequestMonitor<Boolean> rm) {
|
||||||
|
if (fGdb.getSessionType() == SessionType.CORE) {
|
||||||
|
rm.setData(false);
|
||||||
|
rm.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (context instanceof IContainerDMContext) {
|
if (context instanceof IContainerDMContext) {
|
||||||
rm.setData(false);
|
rm.setData(false);
|
||||||
rm.done();
|
rm.done();
|
||||||
|
@ -179,6 +210,15 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stepType == StepType.STEP_RETURN) {
|
if (stepType == StepType.STEP_RETURN) {
|
||||||
|
|
||||||
|
// Check the stuff we know first, before going to the backend for
|
||||||
|
// stack info
|
||||||
|
if (!fReverseModeEnabled || !doCanResume(context)) {
|
||||||
|
rm.setData(false);
|
||||||
|
rm.done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// A step return will always be done in the top stack frame.
|
// A step return will always be done in the top stack frame.
|
||||||
// If the top stack frame is the only stack frame, it does not make sense
|
// If the top stack frame is the only stack frame, it does not make sense
|
||||||
// to do a step return since GDB will reject it.
|
// to do a step return since GDB will reject it.
|
||||||
|
|
|
@ -229,7 +229,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
|
|
||||||
// Tell GDB to use this PTY
|
// Tell GDB to use this PTY
|
||||||
queueCommand(
|
queueCommand(
|
||||||
new MIInferiorTTYSet((ICommandControlDMContext)fControlDmc, fPty.getSlaveName()),
|
new MIInferiorTTYSet(fControlDmc, fPty.getSlaveName()),
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
|
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleFailure() {
|
protected void handleFailure() {
|
||||||
|
@ -248,7 +248,9 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
|
|
||||||
|
|
||||||
public boolean canRestart() {
|
public boolean canRestart() {
|
||||||
if (fMIBackend.getIsAttachSession()) return false;
|
if (fMIBackend.getIsAttachSession() || fMIBackend.getSessionType() == SessionType.CORE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Before GDB6.8, the Linux gdbserver would restart a new
|
// Before GDB6.8, the Linux gdbserver would restart a new
|
||||||
// process when getting a -exec-run but the communication
|
// process when getting a -exec-run but the communication
|
||||||
|
|
|
@ -230,7 +230,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
|
||||||
|
|
||||||
// Tell GDB to use this PTY
|
// Tell GDB to use this PTY
|
||||||
queueCommand(
|
queueCommand(
|
||||||
new MIInferiorTTYSet((ICommandControlDMContext)fControlDmc, fPty.getSlaveName()),
|
new MIInferiorTTYSet(fControlDmc, fPty.getSlaveName()),
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
|
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
|
||||||
@Override
|
@Override
|
||||||
protected void handleFailure() {
|
protected void handleFailure() {
|
||||||
|
@ -249,7 +249,9 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
|
||||||
|
|
||||||
|
|
||||||
public boolean canRestart() {
|
public boolean canRestart() {
|
||||||
if (fMIBackend.getIsAttachSession()) return false;
|
if (fMIBackend.getIsAttachSession()|| fMIBackend.getSessionType() == SessionType.CORE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Before GDB6.8, the Linux gdbserver would restart a new
|
// Before GDB6.8, the Linux gdbserver would restart a new
|
||||||
// process when getting a -exec-run but the communication
|
// process when getting a -exec-run but the communication
|
||||||
|
|
|
@ -51,8 +51,9 @@ class GDBInferiorProcess extends MIInferiorProcess {
|
||||||
// never (we don't kill an independent process.)
|
// never (we don't kill an independent process.)
|
||||||
// - For Program session:
|
// - For Program session:
|
||||||
// if the inferior is still running.
|
// if the inferior is still running.
|
||||||
// - For PostMortem(Core): send event
|
// - For PostMortem(Core):
|
||||||
// else noop
|
// no need to do anything since the inferior
|
||||||
|
// is not running
|
||||||
if (fBackend.getIsAttachSession() == false) {
|
if (fBackend.getIsAttachSession() == false) {
|
||||||
// Try to interrupt the inferior, first.
|
// Try to interrupt the inferior, first.
|
||||||
if (getState() == State.RUNNING) {
|
if (getState() == State.RUNNING) {
|
||||||
|
|
|
@ -18,6 +18,13 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||||
*/
|
*/
|
||||||
public class MITargetSelect extends MICommand<MIInfo> {
|
public class MITargetSelect extends MICommand<MIInfo> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
protected MITargetSelect(IDMContext ctx, String[] params) {
|
||||||
|
super(ctx, "-target-select", null, params); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 1.1
|
* @since 1.1
|
||||||
*/
|
*/
|
||||||
|
@ -31,5 +38,4 @@ public class MITargetSelect extends MICommand<MIInfo> {
|
||||||
public MITargetSelect(IDMContext ctx, String serialDevice, boolean extended) {
|
public MITargetSelect(IDMContext ctx, String serialDevice, boolean extended) {
|
||||||
super(ctx, "-target-select", new String[] { extended ? "extended-remote" : "remote", serialDevice}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
super(ctx, "-target-select", new String[] { extended ? "extended-remote" : "remote", serialDevice}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2009 Ericsson and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Ericsson - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.mi.service.command.commands;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This command sets up a connection with a core file.
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
public class MITargetSelectCore extends MITargetSelect {
|
||||||
|
|
||||||
|
public MITargetSelectCore(IDMContext ctx, String coreFilePath) {
|
||||||
|
super(ctx, new String[] { "core", coreFilePath}); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue