diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml index adfff5e0b64..7c086021cc0 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml @@ -109,6 +109,39 @@ + + + + + + + + + + + + + + + + + + + diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java index 34cbde608d7..a683ed9dbd8 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java @@ -13,17 +13,11 @@ *******************************************************************************/ 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.Arrays; import java.util.Comparator; 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.settings.model.ICConfigurationDescription; 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.ResourcesPlugin; 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.ILaunchConfigurationWorkingCopy; 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.Text; +import com.ibm.icu.text.Collator; + public class CDebuggerTab extends AbstractCDebuggerTab { /** @@ -68,13 +62,14 @@ public class CDebuggerTab extends AbstractCDebuggerTab { * * @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 REMOTE_DEBUGGER_ID = "org.eclipse.cdt.dsf.gdb.GdbServerDebugger";//$NON-NLS-1$ protected boolean fAttachMode = false; protected boolean fRemoteMode = false; + protected boolean fCoreMode = false; protected Button fStopInMain; protected Text fStopInMainSymbol; @@ -84,7 +79,11 @@ public class CDebuggerTab extends AbstractCDebuggerTab { private Composite fContents; 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; ICDebugConfiguration dc = CDebugCorePlugin.getDefault().getDefaultDefaultDebugConfiguration(); @@ -125,7 +124,6 @@ public class CDebuggerTab extends AbstractCDebuggerTab { } protected void loadDebuggerComboBox(ILaunchConfiguration config, String selection) { -// String configPlatform = getPlatform(config); ICDebugConfiguration[] debugConfigs = CDebugCorePlugin.getDefault().getActiveDebugConfigurations(); Arrays.sort(debugConfigs, new Comparator() { public int compare(ICDebugConfiguration c1, ICDebugConfiguration c2) { @@ -144,17 +142,12 @@ public class CDebuggerTab extends AbstractCDebuggerTab { } String defaultSelection = selection; 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)) || (!fRemoteMode && debugConfig.getID().equals(LOCAL_DEBUGGER_ID))) { -// String debuggerPlatform = debugConfig.getPlatform(); -// if (validatePlatform(config, 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 @@ -180,12 +173,15 @@ public class CDebuggerTab extends AbstractCDebuggerTab { } else if (fRemoteMode) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE); + } else if (fCoreMode){ + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, + ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE); } else { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN); } - if (!fAttachMode) { + if (!fAttachMode && !fCoreMode) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT); } @@ -252,16 +248,18 @@ public class CDebuggerTab extends AbstractCDebuggerTab { } else if (fRemoteMode) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE); + } else if (fCoreMode){ + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, + ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE); } else { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN); } - if (!fAttachMode) { + if (!fAttachMode && !fCoreMode) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, fStopInMain.getSelection()); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, fStopInMainSymbol.getText()); - } } @@ -270,22 +268,6 @@ public class CDebuggerTab extends AbstractCDebuggerTab { if (!validateDebuggerConfig(config)) { 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) { // The "Stop on startup at" field must not be empty String mainSymbol = fStopInMainSymbol.getText().trim(); @@ -300,54 +282,6 @@ public class CDebuggerTab extends AbstractCDebuggerTab { 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) { ICDebugConfiguration debugConfig = getDebugConfig(); if (debugConfig == null) { @@ -375,7 +309,7 @@ public class CDebuggerTab extends AbstractCDebuggerTab { GridLayout layout = new GridLayout(numberOfColumns, false); optionsComp.setLayout(layout); 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.addSelectionListener(new SelectionAdapter() { @@ -425,13 +359,13 @@ public class CDebuggerTab extends AbstractCDebuggerTab { protected void initializeCommonControls(ILaunchConfiguration config) { try { - if (!fAttachMode) { + if (!fAttachMode && !fCoreMode) { fStopInMain.setSelection(config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT)); fStopInMainSymbol.setText(config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT)); fStopInMainSymbol.setEnabled(fStopInMain.getSelection()); - } else { + } else if (fAttachMode) { // In attach mode, figure out if we are doing a remote connect based on the currently // chosen debugger if (getDebugConfig().getID().equals(REMOTE_DEBUGGER_ID)) fRemoteMode = true; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainAttachTab.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainAttachTab.java index 8bb19250a28..5825a2990ea 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainAttachTab.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainAttachTab.java @@ -18,6 +18,6 @@ package org.eclipse.cdt.dsf.gdb.internal.ui.launching; */ public class CMainAttachTab extends CMainTab { public CMainAttachTab() { - super(2);// In some case, we don't need to specify an executable + super(CMainTab.DONT_CHECK_PROGRAM); } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainCoreTab.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainCoreTab.java new file mode 100644 index 00000000000..2f23b3152c6 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainCoreTab.java @@ -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); + } +} diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java index 36bab989daa..a04b282ed2a 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java @@ -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.launching.LaunchMessages; import org.eclipse.cdt.ui.CElementLabelProvider; -import org.eclipse.cdt.utils.pty.PTY; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; @@ -78,7 +77,7 @@ public class CMainTab extends CLaunchConfigurationTab { * * @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 protected Label fProjLabel; @@ -90,29 +89,28 @@ public class CMainTab extends CLaunchConfigurationTab { protected Text fProgText; protected Button fSearchButton; - private final boolean fWantsTerminalOption; - protected Button fTerminalButton; + // Core file UI widgets + 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$ private String filterPlatform = EMPTY_STRING; - public static final int WANTS_TERMINAL = 1; public static final int DONT_CHECK_PROGRAM = 2; + public static final int SPECIFY_CORE_FILE = 4; public CMainTab() { this(0); } - public CMainTab(boolean terminalOption) { - this(terminalOption ? WANTS_TERMINAL : 0); - } - public CMainTab(int flags) { - fWantsTerminalOption = (flags & WANTS_TERMINAL) != 0; - dontCheckProgram = (flags & DONT_CHECK_PROGRAM) != 0; + fDontCheckProgram = (flags & DONT_CHECK_PROGRAM) != 0; + fSpecifyCoreFile = (flags & SPECIFY_CORE_FILE) != 0; } /* @@ -133,9 +131,10 @@ public class CMainTab extends CLaunchConfigurationTab { createProjectGroup(comp, 1); createExeFileGroup(comp, 1); createVerticalSpacer(comp, 1); - if (wantsTerminalOption() /* && ProcessFactory.supportesTerminal() */) { - createTerminalOption(comp, 1); + if (fSpecifyCoreFile) { + createCoreFileGroup(comp, 1); } + GdbUIPlugin.setDialogShell(parent.getShell()); } @@ -210,41 +209,57 @@ public class CMainTab extends CLaunchConfigurationTab { } }); - Button fBrowseForBinaryButton; - fBrowseForBinaryButton = createPushButton(mainComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$ - fBrowseForBinaryButton.addSelectionListener(new SelectionAdapter() { + Button browseForBinaryButton; + browseForBinaryButton = createPushButton(mainComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$ + browseForBinaryButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent evt) { - handleBinaryBrowseButtonSelected(); + String text = handleBrowseButtonSelected(); + if (text != null) { + fProgText.setText(text); + } updateLaunchConfigurationDialog(); } }); - } - - protected boolean wantsTerminalOption() { - return fWantsTerminalOption; - } - - protected void createTerminalOption(Composite parent, int colSpan) { - Composite mainComp = new Composite(parent, SWT.NONE); - GridLayout mainLayout = new GridLayout(); - mainLayout.numColumns = 1; - mainLayout.marginHeight = 0; - mainLayout.marginWidth = 0; - mainComp.setLayout(mainLayout); + } + + /** @since 2.0 */ + protected void createCoreFileGroup(Composite parent, int colSpan) { + Composite coreComp = new Composite(parent, SWT.NONE); + GridLayout coreLayout = new GridLayout(); + coreLayout.numColumns = 3; + coreLayout.marginHeight = 0; + coreLayout.marginWidth = 0; + coreComp.setLayout(coreLayout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = colSpan; - mainComp.setLayoutData(gd); - - fTerminalButton = createCheckButton(mainComp, LaunchMessages.getString("CMainTab.UseTerminal")); //$NON-NLS-1$ - fTerminalButton.addSelectionListener(new SelectionAdapter() { - - @Override - public void widgetSelected(SelectionEvent evt) { + coreComp.setLayoutData(gd); + fCoreLabel = new Label(coreComp, SWT.NONE); + fCoreLabel.setText(LaunchMessages.getString("CMainTab.CoreFile_path")); //$NON-NLS-1$ + gd = new GridData(); + gd.horizontalSpan = 3; + fCoreLabel.setLayoutData(gd); + 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(); } }); - fTerminalButton.setEnabled(PTY.isSupported()); } /* @@ -256,19 +271,7 @@ public class CMainTab extends CLaunchConfigurationTab { filterPlatform = getPlatform(config); updateProjectFromConfig(config); updateProgramFromConfig(config); - updateTerminalFromConfig(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); - } + updateCoreFromConfig(config); } protected void updateProjectFromConfig(ILaunchConfiguration config) { @@ -290,6 +293,19 @@ public class CMainTab extends CLaunchConfigurationTab { } 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) @@ -318,8 +334,8 @@ public class CMainTab extends CLaunchConfigurationTab { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText()); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, fProgText.getText()); - if (fTerminalButton != null) { - config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, fTerminalButton.getSelection()); + if (fCoreText != null) { + 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 - * type, allowing the user to key a main type name, or constraining the search for main types to - * the specified project. + * Show a dialog that lets the user select a file. */ - protected void handleBinaryBrowseButtonSelected() { - 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; - } + protected String handleBrowseButtonSelected() { FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); fileDialog.setFileName(fProgText.getText()); - String text= fileDialog.open(); - if (text != null) { - fProgText.setText(text); - } + return fileDialog.open(); } /** @@ -537,57 +542,73 @@ public class CMainTab extends CLaunchConfigurationTab { setErrorMessage(null); setMessage(null); - if (dontCheckProgram) - return true; + if (!fDontCheckProgram) { + 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(); - 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; - } - - 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()) { + 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; } - exePath = project.getFile(name).getLocation(); - } else { - if (!exePath.toFile().exists()) { - setErrorMessage(LaunchMessages.getString("CMainTab.Program_does_not_exist")); //$NON-NLS-1$ + IPath exePath = new Path(name); + if (!exePath.isAbsolute()) { + if (!project.getFile(name).exists()) { + 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; } } - 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; } @@ -625,25 +646,21 @@ public class CMainTab extends CLaunchConfigurationTab { * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void setDefaults(ILaunchConfigurationWorkingCopy config) { - // We set empty attributes for project & program so that when one config - // is - // compared to another, the existence of empty attributes doesn't cause - // an - // incorrect result (the performApply() method can result in empty - // values + // We set empty attributes for project & program so that when one config is + // compared to another, the existence of empty attributes doesn't cause and + // incorrect result (the performApply() method can result in empty values // for these attributes being set on a config if there is nothing in the // corresponding text boxes) // plus getContext will use this to base context from if set. config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, EMPTY_STRING); + ICElement cElement = null; cElement = getContext(config, getPlatform(config)); if (cElement != null) { initializeCProject(cElement, config); initializeProgramName(cElement, config); } - if (wantsTerminalOption()) { - config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, ICDTLaunchConfigurationConstants.USE_TERMINAL_DEFAULT); - } } /** diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CoreFileDebuggerTab.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CoreFileDebuggerTab.java new file mode 100644 index 00000000000..77078788529 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CoreFileDebuggerTab.java @@ -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(); + } +} diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CoreFilePrompter.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CoreFilePrompter.java new file mode 100644 index 00000000000..c41e9c114cd --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CoreFilePrompter.java @@ -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; + } +} diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/GdbCoreDebuggerPage.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/GdbCoreDebuggerPage.java new file mode 100644 index 00000000000..c81a2d546b2 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/GdbCoreDebuggerPage.java @@ -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; + } +} diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml index 5d6300f5df3..14431d7ec88 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml @@ -34,6 +34,16 @@ sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator" sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer"> + + (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. */ @@ -429,10 +487,14 @@ public class FinalLaunchSequence extends Sequence { */ new Step() { @Override public void execute(final RequestMonitor requestMonitor) { - MIBreakpointsManager bpmService = fTracker.getService(MIBreakpointsManager.class); - IBreakpointsTargetDMContext breakpointDmc = (IBreakpointsTargetDMContext)fCommandControl.getContext(); + if (fSessionType != SessionType.CORE) { + 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. @@ -440,7 +502,11 @@ public class FinalLaunchSequence extends Sequence { new Step() { @Override public void execute(final RequestMonitor requestMonitor) { - fCommandControl.start(fLaunch, requestMonitor); + if (fSessionType != SessionType.CORE) { + fCommandControl.start(fLaunch, requestMonitor); + } else { + requestMonitor.done(); + } } }, /* diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunchDelegate.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunchDelegate.java index 056d90ac09d..145a1a4611e 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunchDelegate.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunchDelegate.java @@ -98,6 +98,8 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate if (sessionType == SessionType.REMOTE) { monitor.subTask( "Debugging remote C/C++ application" ); + } else if (sessionType == SessionType.CORE) { + monitor.subTask( "Post Mortem Debugging of C/C++ application" ); } else { 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. launch.addCLIProcess("gdb"); //$NON-NLS-1$ - if (!attach) { + if (!attach && sessionType != SessionType.CORE) { launch.addInferiorProcess(exePath.lastSegment()); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties index 7ee2543bc37..4703cd46f79 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties @@ -85,9 +85,11 @@ CMainTab.Project_not_specified=Project not specified CMainTab.Program_not_specified=Program not specified CMainTab.Project_must_be_opened=Project must be opened CMainTab.Program_does_not_exist=Program does not exist +CMainTab.Core_does_not_exist=Core file does not exist CMainTab.Main=Main CMainTab.&ProjectColon=&Project: CMainTab.C/C++_Application=C/C++ Application: +CMainTab.CoreFile_path=Core file (leave blank to trigger prompt:) CMainTab.Search...=Searc&h Project... CMainTab.Choose_program_to_run=Choose a &program to run: CMainTab.Choose_program_to_run_from_NAME=Choose a program to run from {0}: diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java index ee80e7ee44f..9c261ad877b 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java @@ -151,8 +151,34 @@ public class GDBRunControl extends MIRunControl { } } + @Override + public void canResume(IExecutionDMContext context, DataRequestMonitor rm) { + if (fGdb.getSessionType() == SessionType.CORE) { + rm.setData(false); + rm.done(); + return; + } + super.canResume(context, rm); + } + + @Override + public void canSuspend(IExecutionDMContext context, DataRequestMonitor 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 rm) { + if (fGdb.getSessionType() == SessionType.CORE) { + rm.setData(false); + rm.done(); + return; + } + if (context instanceof IContainerDMContext) { rm.setData(false); rm.done(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java index 62833b61650..79d36bd614d 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java @@ -71,6 +71,11 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro fGdb = getServicesTracker().getService(IGDBBackend.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(), IReverseRunControl.class.getName()}, new Hashtable()); @@ -131,8 +136,34 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro }); } - @Override + @Override + public void canResume(IExecutionDMContext context, DataRequestMonitor rm) { + if (fGdb.getSessionType() == SessionType.CORE) { + rm.setData(false); + rm.done(); + return; + } + super.canResume(context, rm); + } + + @Override + public void canSuspend(IExecutionDMContext context, DataRequestMonitor 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 rm) { + if (fGdb.getSessionType() == SessionType.CORE) { + rm.setData(false); + rm.done(); + return; + } + if (context instanceof IContainerDMContext) { rm.setData(false); rm.done(); @@ -179,6 +210,15 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro } 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. // 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. diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java index 338c0676ebf..39763536a69 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java @@ -229,7 +229,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl { // Tell GDB to use this PTY queueCommand( - new MIInferiorTTYSet((ICommandControlDMContext)fControlDmc, fPty.getSlaveName()), + new MIInferiorTTYSet(fControlDmc, fPty.getSlaveName()), new DataRequestMonitor(getExecutor(), requestMonitor) { @Override protected void handleFailure() { @@ -248,7 +248,9 @@ public class GDBControl extends AbstractMIControl implements IGDBControl { 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 // process when getting a -exec-run but the communication diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java index 41d04f83bbe..a8c78987f72 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java @@ -230,7 +230,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl { // Tell GDB to use this PTY queueCommand( - new MIInferiorTTYSet((ICommandControlDMContext)fControlDmc, fPty.getSlaveName()), + new MIInferiorTTYSet(fControlDmc, fPty.getSlaveName()), new DataRequestMonitor(getExecutor(), requestMonitor) { @Override protected void handleFailure() { @@ -249,7 +249,9 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl { 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 // process when getting a -exec-run but the communication diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBInferiorProcess.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBInferiorProcess.java index 51c3114646a..61149edb43f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBInferiorProcess.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBInferiorProcess.java @@ -51,8 +51,9 @@ class GDBInferiorProcess extends MIInferiorProcess { // never (we don't kill an independent process.) // - For Program session: // if the inferior is still running. - // - For PostMortem(Core): send event - // else noop + // - For PostMortem(Core): + // no need to do anything since the inferior + // is not running if (fBackend.getIsAttachSession() == false) { // Try to interrupt the inferior, first. if (getState() == State.RUNNING) { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/MITargetSelect.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/MITargetSelect.java index 3e96ad3c138..eb45aad55ef 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/MITargetSelect.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/MITargetSelect.java @@ -18,6 +18,13 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; */ public class MITargetSelect extends MICommand { + /** + * @since 2.0 + */ + protected MITargetSelect(IDMContext ctx, String[] params) { + super(ctx, "-target-select", null, params); //$NON-NLS-1$ + } + /** * @since 1.1 */ @@ -31,5 +38,4 @@ public class MITargetSelect extends MICommand { 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$ } - } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/MITargetSelectCore.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/MITargetSelectCore.java new file mode 100644 index 00000000000..6448028a09b --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/commands/MITargetSelectCore.java @@ -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$ + } +}