1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

[310304] GDB (DSF) Hardware Debugging Launcher ignores application program path

This commit is contained in:
John Cortell 2010-05-06 20:17:04 +00:00
parent 4e0258df9a
commit e42056257a
18 changed files with 681 additions and 283 deletions

View file

@ -12,10 +12,10 @@
package org.eclipse.cdt.debug.core;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import com.ibm.icu.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
@ -40,6 +40,7 @@ import org.eclipse.cdt.debug.core.model.ICValue;
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
import org.eclipse.cdt.debug.core.model.ICWatchpoint2;
import org.eclipse.cdt.debug.internal.core.model.CFloatingPointValue;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
@ -47,12 +48,15 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IStatusHandler;
import org.eclipse.debug.core.model.IBreakpoint;
import org.w3c.dom.Document;
import com.ibm.icu.text.MessageFormat;
/**
* Utility methods.
*/
@ -561,4 +565,127 @@ public class CDebugUtils {
}
return new Path(path);
}
/**
* Returns the ICProject associated with the project setting in the Main tab
* of a CDT launch configuration, or throws a CoreException providing a
* reason (e.g., the setting is empty, the project no longer exists, the
* isn't a CDT one, etc).
*
* @param config
* the launch configuration
* @return an ICProject; never null.
* @throws CoreException
* @since 7.0
*/
public static ICProject verifyCProject(ILaunchConfiguration config) throws CoreException {
String name = CDebugUtils.getProjectName(config);
if (name == null) {
throwCoreException(DebugCoreMessages.getString("CDebugUtils.C_Project_not_specified"), //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROJECT);
}
ICProject cproject = CDebugUtils.getCProject(config);
if (cproject == null) {
IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
if (!proj.exists()) {
throwCoreException(DebugCoreMessages.getFormattedString("CDebugUtils.Project_NAME_does_not_exist", name), //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
} else if (!proj.isOpen()) {
throwCoreException(DebugCoreMessages.getFormattedString("CDebugUtils.Project_NAME_is_closed", name), //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
}
throwCoreException(DebugCoreMessages.getString("CDebugUtils.Not_a_C_CPP_project"), //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
}
return cproject;
}
/**
* Returns an IPath for the file referenced in the <i>C/C++ Application</i>
* setting of a CDT launch configuration. Typically, the file is obtained by
* combining the <i>C/C++ Application</i> setting with the <i>Project</i>
* setting. If unable to combine and resolve these settings to a valid file,
* a CoreException is thrown that provides the reason why. There are many
* such possible reasons (a problem with the <i>Project</i> setting, an
* empty <i>C/C++ Application</i> setting, the combined settings doesn't
* resolve to an existing file, etc).
*
* @param config
* the launch configuration
* @param ignoreProjectSetting
* if true, resolve the file using only the <i>C/C++
* Application</i> setting. Do not take the <i>Project</i>
* setting into account.
* @return an IPath; never null
* @throws CoreException
* @since 7.0
*/
public static IPath verifyProgramPath(ILaunchConfiguration config, boolean ignoreProjectSetting) throws CoreException {
ICProject cproject = null;
if (!ignoreProjectSetting) {
cproject = verifyCProject(config); // will throw exception if project setting not valid
}
IPath programPath = CDebugUtils.getProgramPath(config);
if (programPath == null || programPath.isEmpty()) {
throwCoreException(DebugCoreMessages.getString("CDebugUtils.Program_file_not_specified"), //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROGRAM);
}
if (programPath != null) { // this check is here only to avoid warning; compiler can't tell we'll throw an exception above
if (!programPath.isAbsolute() && (cproject != null)) {
// See if we can brute-force append the program path to the
// project location. This allows us to support the program file
// being outside the project, even outside the workspace, without
// requiring a linked resource (e.g., the setting could be
// "..\..\some\dir\myprogram.exe")
IPath location = cproject.getProject().getLocation();
if (location != null) {
programPath = location.append(programPath);
if (!programPath.toFile().exists()) {
// Try looking in the project for the file. This
// supports linked resources.
IFile projFile = null;
try {
projFile = cproject.getProject().getFile(CDebugUtils.getProgramPath(config));
}
catch (IllegalArgumentException exc) {
// thrown if relative path that resolves to a root file (e.g., "..\somefile")
}
if (projFile != null && projFile.exists()) {
programPath = projFile.getLocation();
}
}
}
}
if (!programPath.toFile().exists()) {
throwCoreException(
DebugCoreMessages.getString("CDebugUtils.Program_file_does_not_exist"), //$NON-NLS-1$
new FileNotFoundException(
DebugCoreMessages.getFormattedString("CDebugUtils.PROGRAM_PATH_not_found", programPath.toOSString())), //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_EXIST);
}
}
return programPath;
}
/**
* Variant that expects (requires) the launch configuration to have a valid
* <i>Project</i> setting. See
* {@link #verifyProgramPath(ILaunchConfiguration, boolean)}
*
* @since 7.0
*/
public static IPath verifyProgramPath(ILaunchConfiguration config) throws CoreException {
return verifyProgramPath(config, false);
}
/** Throws a CoreException. Clutter-reducing utility method. */
private static void throwCoreException(String msg, int code) throws CoreException {
throwCoreException(msg, null, code);
}
/** Throws a CoreException. Clutter-reducing utility method. */
private static void throwCoreException(String msg, Exception innerException, int code) throws CoreException {
throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), code, msg, innerException));
}
}

View file

@ -13,6 +13,8 @@ package org.eclipse.cdt.debug.core;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import com.ibm.icu.text.MessageFormat;
public class DebugCoreMessages {
private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.core.DebugCoreMessages";//$NON-NLS-1$
@ -22,6 +24,14 @@ public class DebugCoreMessages {
private DebugCoreMessages() {
}
static String getFormattedString(String key, String arg) {
return MessageFormat.format(getString(key), new String[]{arg});
}
static String getFormattedString(String key, String[] args) {
return MessageFormat.format(getString(key), args);
}
public static String getString( String key ) {
try {
return RESOURCE_BUNDLE.getString( key );

View file

@ -23,4 +23,12 @@ CDebugUtils.Regular=Regular
CDebugUtils.Hardware=Hardware
CDebugUtils.Temporary=Temporary
CDebugUtils.Software=Software
CDebugUtils.C_Project_not_specified=A project was not specified in the launch configuration.
CDebugUtils.Not_a_C_CPP_project=The project specified in the launch configuration is not a C/C++ one.
CDebugUtils.PROGRAM_PATH_not_found={0} not found
CDebugUtils.Program_file_does_not_exist=The program file specified in the launch configuration does not exist
CDebugUtils.Program_file_not_specified=A program file was not specified in the launch configuration.
CDebugUtils.Project_NAME_does_not_exist=Project {0} does not exist. Please check that your launch configuration specifies a valid project in your workspace.
CDebugUtils.Project_NAME_is_closed=Project {0} is closed
CDIDebugModel.0=Unable to parser binary information from file

View file

@ -27,6 +27,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContribution;
import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContributionFactory;
import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice;
@ -350,7 +351,7 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
// Below steps are specific to JTag hardware debugging
/*
* Retrieve the JTag device
* Retrieve the IGDBJtagDevice instance
*/
new Step() {
@Override
@ -369,6 +370,61 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
}
rm.done();
}},
/*
* Execute symbol loading
*/
new Step() {
@Override
public void execute(RequestMonitor rm) {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
if (config.getAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS)) {
String symbolsFileName = null;
// New setting in Helios. Default is true. Check for existence
// in order to support older launch configs
if (config.hasAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_SYMBOLS) &&
config.getAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_SYMBOLS, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_SYMBOLS)) {
IPath programFile = CDebugUtils.verifyProgramPath(config);
if (programFile != null) {
symbolsFileName = programFile.toOSString();
}
}
else {
symbolsFileName = config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, IGDBJtagConstants.DEFAULT_SYMBOLS_FILE_NAME);
if (symbolsFileName.length() > 0) {
symbolsFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(symbolsFileName);
} else {
symbolsFileName = null;
}
}
if (symbolsFileName == null) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, Messages.getString("GDBJtagDebugger.err_no_img_file"), null)); //$NON-NLS-1$
rm.done();
return;
}
// Escape windows path separator characters TWICE, once for Java and once for GDB.
symbolsFileName = symbolsFileName.replace("\\", "\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
String symbolsOffset = config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, IGDBJtagConstants.DEFAULT_SYMBOLS_OFFSET);
if (symbolsOffset.length() > 0) {
symbolsOffset = "0x" + symbolsOffset;
}
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doLoadSymbol(symbolsFileName, symbolsOffset, commands);
queueCommands(commands, rm);
} else {
rm.done();
}
} catch (CoreException e) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, "Cannot load symbol", e)); //$NON-NLS-1$
rm.done();
}
}},
/*
* Hook up to remote target
*/
@ -410,7 +466,7 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
public void execute(RequestMonitor rm) {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_RESET, true)) {
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_RESET, IGDBJtagConstants.DEFAULT_DO_RESET)) {
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doReset(commands);
queueCommands(commands, rm);
@ -447,7 +503,7 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
public void execute(RequestMonitor rm) {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_HALT, true)) {
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_HALT, IGDBJtagConstants.DEFAULT_DO_HALT)) {
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doHalt(commands);
queueCommands(commands, rm);
@ -467,16 +523,21 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
public void execute(RequestMonitor rm) {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
String userCmd = config.getAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, ""); //$NON-NLS-1$
String userCmd = config.getAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, IGDBJtagConstants.DEFAULT_INIT_COMMANDS);
userCmd = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(userCmd);
String[] commands = userCmd.split("\\r?\\n"); //$NON-NLS-1$
CountingRequestMonitor crm = new CountingRequestMonitor(getExecutor(), rm);
crm.setDoneCount(commands.length);
for (int i = 0; i < commands.length; ++i) {
fCommandControl.queueCommand(
new CLICommand<MIInfo>(fCommandControl.getContext(), commands[i]),
new DataRequestMonitor<MIInfo>(getExecutor(), crm));
if (userCmd.length() > 0) {
String[] commands = userCmd.split("\\r?\\n"); //$NON-NLS-1$
CountingRequestMonitor crm = new CountingRequestMonitor(getExecutor(), rm);
crm.setDoneCount(commands.length);
for (int i = 0; i < commands.length; ++i) {
fCommandControl.queueCommand(
new CLICommand<MIInfo>(fCommandControl.getContext(), commands[i]),
new DataRequestMonitor<MIInfo>(getExecutor(), crm));
}
}
else {
rm.done();
}
} catch (CoreException e) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, "Cannot run user defined init commands", e)); //$NON-NLS-1$
@ -491,20 +552,44 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
public void execute(RequestMonitor rm) {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
String imageFileName = null;
if (config.getAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE)) {
// Escape windows path separator characters TWICE, once for Java and once for GDB.
String imageFileName = config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, ""); //$NON-NLS-1$
if (imageFileName.length() > 0) {
imageFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName).replace("\\", "\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
String imageOffset = (imageFileName.endsWith(".elf")) ? "" : "0x" + config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doLoadImage(imageFileName, imageOffset, commands);
queueCommands(commands, rm);
} else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, "Image name cannot be empty", null)); //$NON-NLS-1$
rm.done();
// New setting in Helios. Default is true. Check for existence
// in order to support older launch configs
if (config.hasAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_IMAGE) &&
config.getAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_IMAGE, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_IMAGE)) {
IPath programFile = CDebugUtils.verifyProgramPath(config);
if (programFile != null) {
imageFileName = programFile.toOSString();
}
}
} else {
else {
imageFileName = config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, IGDBJtagConstants.DEFAULT_IMAGE_FILE_NAME); //$NON-NLS-1$
if (imageFileName.length() > 0) {
imageFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName);
} else {
imageFileName = null;
}
}
if (imageFileName == null) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, Messages.getString("GDBJtagDebugger.err_no_img_file"), null)); //$NON-NLS-1$
rm.done();
return;
}
// Escape windows path separator characters TWICE, once for Java and once for GDB.
imageFileName = imageFileName.replace("\\", "\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
String imageOffset = config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_IMAGE_OFFSET);
if (imageOffset.length() > 0) {
imageOffset = (imageFileName.endsWith(".elf")) ? "" : "0x" + config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_IMAGE_OFFSET); //$NON-NLS-2$ //$NON-NLS-4$
}
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doLoadImage(imageFileName, imageOffset, commands);
queueCommands(commands, rm);
}
else {
rm.done();
}
} catch (CoreException e) {
@ -512,36 +597,6 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
rm.done();
}
}},
/*
* Execute symbol loading
*/
new Step() {
@Override
public void execute(RequestMonitor rm) {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
if (config.getAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS)) {
// Escape windows path separator characters TWICE, once for Java and once for GDB.
String symbolsFileName = config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, ""); //$NON-NLS-1$
if (symbolsFileName.length() > 0) {
symbolsFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(symbolsFileName).replace("\\", "\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
String symbolsOffset = "0x" + config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, ""); //$NON-NLS-1$ //$NON-NLS-2$
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doLoadSymbol(symbolsFileName, symbolsOffset, commands);
queueCommands(commands, rm);
} else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, "Symbol name cannot be empty", null)); //$NON-NLS-1$
rm.done();
}
} else {
rm.done();
}
} catch (CoreException e) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, "Cannot load symbol", e)); //$NON-NLS-1$
rm.done();
}
}
},
/*
* Start tracking the breakpoints once we know we are connected to the target (necessary for remote debugging)
*/
@ -566,7 +621,7 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
if (config.getAttribute(IGDBJtagConstants.ATTR_SET_PC_REGISTER, IGDBJtagConstants.DEFAULT_SET_PC_REGISTER)) {
String pcRegister = config.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, "")); //$NON-NLS-1$
String pcRegister = config.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_PC_REGISTER)); //$NON-NLS-1$
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doSetPC(pcRegister, commands);
queueCommands(commands, rm);
@ -587,7 +642,7 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
if (config.getAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, IGDBJtagConstants.DEFAULT_SET_STOP_AT)) {
String stopAt = config.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, ""); //$NON-NLS-1$
String stopAt = config.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, IGDBJtagConstants.DEFAULT_STOP_AT); //$NON-NLS-1$
List<String> commands = new ArrayList<String>();
fGdbJtagDevice.doStopAt(stopAt, commands);
queueCommands(commands, rm);
@ -628,16 +683,21 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
public void execute(RequestMonitor rm) {
ILaunchConfiguration config = fLaunch.getLaunchConfiguration();
try {
String userCmd = config.getAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, ""); //$NON-NLS-1$
userCmd = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(userCmd);
String[] commands = userCmd.split("\\r?\\n"); //$NON-NLS-1$
CountingRequestMonitor crm = new CountingRequestMonitor(getExecutor(), rm);
crm.setDoneCount(commands.length);
for (int i = 0; i < commands.length; ++i) {
fCommandControl.queueCommand(
new CLICommand<MIInfo>(fCommandControl.getContext(), commands[i]),
new DataRequestMonitor<MIInfo>(getExecutor(), crm));
String userCmd = config.getAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, IGDBJtagConstants.DEFAULT_RUN_COMMANDS); //$NON-NLS-1$
if (userCmd.length() > 0) {
userCmd = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(userCmd);
String[] commands = userCmd.split("\\r?\\n"); //$NON-NLS-1$
CountingRequestMonitor crm = new CountingRequestMonitor(getExecutor(), rm);
crm.setDoneCount(commands.length);
for (int i = 0; i < commands.length; ++i) {
fCommandControl.queueCommand(
new CLICommand<MIInfo>(fCommandControl.getContext(), commands[i]),
new DataRequestMonitor<MIInfo>(getExecutor(), crm));
}
}
else {
rm.done();
}
} catch (CoreException e) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, "Cannot run user defined run commands", e)); //$NON-NLS-1$
@ -703,12 +763,11 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
private IGDBJtagDevice getGDBJtagDevice (ILaunchConfiguration config)
throws CoreException, NullPointerException {
IGDBJtagDevice gdbJtagDevice = null;
String jtagDeviceName = config.getAttribute(IGDBJtagConstants.ATTR_JTAG_DEVICE, ""); //$NON-NLS-1$
GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory.
getInstance().getGDBJtagDeviceContribution();
for (int i = 0; i < availableDevices.length; i++) {
if (jtagDeviceName.equals(availableDevices[i].getDeviceName())) {
gdbJtagDevice = availableDevices[i].getDevice();
String jtagDeviceName = config.getAttribute(IGDBJtagConstants.ATTR_JTAG_DEVICE, IGDBJtagConstants.DEFAULT_JTAG_DEVICE); //$NON-NLS-1$
GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory.getInstance().getGDBJtagDeviceContribution();
for (GDBJtagDeviceContribution availableDevice : availableDevices) {
if (jtagDeviceName.equals(availableDevice.getDeviceName())) {
gdbJtagDevice = availableDevice.getDevice();
break;
}
}

View file

@ -24,6 +24,7 @@ import java.util.List;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.cdi.ICDISession;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
@ -41,6 +42,7 @@ import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.MIGDBSetNewConsole;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
@ -117,14 +119,58 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
List<String> commands = new ArrayList<String>();
// hook up to remote target
if (submonitor.isCanceled()) {
throw new OperationCanceledException();
}
// execute symbol load
boolean doLoadSymbols = config.getAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS);
if (doLoadSymbols) {
String symbolsFileName = null;
// New setting in Helios. Default is true. Check for existence
// in order to support older launch configs
if (config.hasAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_SYMBOLS) &&
config.getAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_SYMBOLS, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_SYMBOLS)) {
IPath programFile = CDebugUtils.verifyProgramPath(config);
if (programFile != null) {
symbolsFileName = programFile.toOSString();
}
}
else {
symbolsFileName = config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, IGDBJtagConstants.DEFAULT_SYMBOLS_FILE_NAME);
if (symbolsFileName.length() > 0) {
symbolsFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(symbolsFileName);
}
}
if (symbolsFileName == null) {
// The launch config GUI should prevent this from happening, but just in case
throw new CoreException(new Status( IStatus.ERROR,
Activator.getUniqueIdentifier(),
-1, Messages.getString("GDBJtagDebugger.err_no_sym_file"), null));
}
// Escape windows path separator characters TWICE, once for Java and once for GDB.
symbolsFileName = symbolsFileName.replace("\\", "\\\\");
String symbolsOffset = config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, IGDBJtagConstants.DEFAULT_SYMBOLS_OFFSET);
if (symbolsOffset.length() > 0) {
symbolsOffset = "0x" + symbolsOffset;
}
commands.clear();
gdbJtagDevice.doLoadSymbol(symbolsFileName, symbolsOffset, commands);
monitor.beginTask(Messages.getString("GDBJtagDebugger.loading_symbols"), 1); //$NON-NLS-1$
executeGDBScript(getGDBScript(commands), miSession, submonitor.newChild(15));
}
if (submonitor.isCanceled()) {
throw new OperationCanceledException();
}
// hook up to remote target
boolean useRemote = config.getAttribute(IGDBJtagConstants.ATTR_USE_REMOTE_TARGET, IGDBJtagConstants.DEFAULT_USE_REMOTE_TARGET);
if (useRemote) {
submonitor.subTask(Messages.getString("GDBJtagDebugger.2")); //$NON-NLS-1$
try {
commands.clear();
if (gdbJtagDevice instanceof IGDBJtagConnection) {
URI connection = new URI(config.getAttribute(IGDBJtagConstants.ATTR_CONNECTION, IGDBJtagConstants.DEFAULT_CONNECTION));
IGDBJtagConnection device = (IGDBJtagConnection)gdbJtagDevice;
@ -149,7 +195,7 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
submonitor.setWorkRemaining(80); // compensate for optional work above
// Run device-specific code to reset the board
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_RESET, true)) {
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_RESET, IGDBJtagConstants.DEFAULT_DO_RESET)) {
commands.clear();
gdbJtagDevice.doReset(commands);
int defaultDelay = gdbJtagDevice.getDefaultDelay();
@ -159,7 +205,7 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
submonitor.setWorkRemaining(65); // compensate for optional work above
// Run device-specific code to halt the board
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_HALT, true)) {
if (config.getAttribute(IGDBJtagConstants.ATTR_DO_HALT, IGDBJtagConstants.DEFAULT_DO_HALT)) {
commands.clear();
gdbJtagDevice.doHalt(commands);
executeGDBScript(getGDBScript(commands), miSession, submonitor.newChild(15));
@ -172,31 +218,44 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
// execute load
boolean doLoad = config.getAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE);
if (doLoad) {
// Escape windows path separator characters TWICE, once for Java and once for GDB.
String imageFileName = config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, ""); //$NON-NLS-1$
if (imageFileName.length() > 0) {
monitor.beginTask(Messages.getString("GDBJtagDebugger.5"), 1); //$NON-NLS-1$
imageFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName).replace("\\", "\\\\");
String imageOffset = (imageFileName.endsWith(".elf")) ? "" : "0x" + config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, ""); //$NON-NLS-2$ //$NON-NLS-4$
commands.clear();
gdbJtagDevice.doLoadImage(imageFileName, imageOffset, commands);
executeGDBScript(getGDBScript(commands), miSession, submonitor.newChild(20));
String imageFileName = null;
// New setting in Helios. Default is true. Check for existence
// in order to support older launch configs
if (config.hasAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_IMAGE) &&
config.getAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_IMAGE, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_IMAGE)) {
IPath programFile = CDebugUtils.verifyProgramPath(config);
if (programFile != null) {
imageFileName = programFile.toOSString();
}
}
else {
imageFileName = config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, IGDBJtagConstants.DEFAULT_IMAGE_FILE_NAME);
if (imageFileName.length() > 0) {
imageFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName);
}
}
if (imageFileName == null) {
// The launch config GUI should prevent this from happening, but just in case
throw new CoreException(new Status( IStatus.ERROR,
Activator.getUniqueIdentifier(),
-1, Messages.getString("GDBJtagDebugger.err_no_img_file"), null));
}
imageFileName = imageFileName.replace("\\", "\\\\");
String imageOffset = config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_IMAGE_OFFSET);
if (imageOffset.length() > 0) {
imageOffset = (imageFileName.endsWith(".elf")) ? "" : "0x" + config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_IMAGE_OFFSET);
}
commands.clear();
gdbJtagDevice.doLoadImage(imageFileName, imageOffset, commands);
monitor.beginTask(Messages.getString("GDBJtagDebugger.loading_image"), 1); //$NON-NLS-1$
executeGDBScript(getGDBScript(commands), miSession, submonitor.newChild(20));
}
submonitor.setWorkRemaining(15); // compensate for optional work above
// execute symbol load
boolean doLoadSymbols = config.getAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS);
if (doLoadSymbols) {
String symbolsFileName = config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, ""); //$NON-NLS-1$
if (symbolsFileName.length() > 0) {
symbolsFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(symbolsFileName).replace("\\", "\\\\");
String symbolsOffset = "0x" + config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, ""); //$NON-NLS-2$
commands.clear();
gdbJtagDevice.doLoadSymbol(symbolsFileName, symbolsOffset, commands);
executeGDBScript(getGDBScript(commands), miSession, submonitor.newChild(15));
}
}
} catch (OperationCanceledException e) {
if (launch != null && launch.canTerminate()) {
launch.terminate();
@ -229,7 +288,7 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
// Set program counter
boolean setPc = config.getAttribute(IGDBJtagConstants.ATTR_SET_PC_REGISTER, IGDBJtagConstants.DEFAULT_SET_PC_REGISTER);
if (setPc) {
String pcRegister = config.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, "")); //$NON-NLS-1$
String pcRegister = config.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_PC_REGISTER)); //$NON-NLS-1$
gdbJtagDevice.doSetPC(pcRegister, commands);
executeGDBScript(getGDBScript(commands), miSession, submonitor.newChild(20));
}
@ -239,7 +298,7 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
monitor.beginTask(Messages.getString("GDBJtagDebugger.18"), 1); //$NON-NLS-1$
boolean setStopAt = config.getAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, IGDBJtagConstants.DEFAULT_SET_STOP_AT);
if (setStopAt) {
String stopAt = config.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, ""); //$NON-NLS-1$
String stopAt = config.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, IGDBJtagConstants.DEFAULT_STOP_AT); //$NON-NLS-1$
commands.clear();
gdbJtagDevice.doStopAt(stopAt, commands);
executeGDBScript(getGDBScript(commands), miSession, submonitor.newChild(20));
@ -266,7 +325,7 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
private void executeGDBScript(String script, MISession miSession,
IProgressMonitor monitor) throws CoreException {
// Try to execute any extra command
if (script == null)
if (script == null || script.length() == 0)
return;
script = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(script);
String[] commands = script.split("\\r?\\n");
@ -309,7 +368,7 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger {
private IGDBJtagDevice getGDBJtagDevice (ILaunchConfiguration config)
throws CoreException, NullPointerException {
IGDBJtagDevice gdbJtagDevice = null;
String jtagDeviceName = config.getAttribute(IGDBJtagConstants.ATTR_JTAG_DEVICE, ""); //$NON-NLS-1$
String jtagDeviceName = config.getAttribute(IGDBJtagConstants.ATTR_JTAG_DEVICE, IGDBJtagConstants.DEFAULT_JTAG_DEVICE); //$NON-NLS-1$
GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory.
getInstance().getGDBJtagDeviceContribution();
for (int i = 0; i < availableDevices.length; i++) {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007 QNX Software Systems and others.
* Copyright (c) 2007 - 2010 QNX Software Systems 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
@ -10,11 +10,10 @@
*******************************************************************************/
package org.eclipse.cdt.debug.gdbjtag.core;
import java.io.File;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDISession;
@ -48,10 +47,9 @@ public class GDBJtagLaunchConfigurationDelegate extends AbstractCLaunchDelegate
if (mode.equals(ILaunchManager.DEBUG_MODE)) {
GDBJtagDebugger debugger = new GDBJtagDebugger();
ICProject project = verifyCProject(configuration);
IPath exePath = verifyProgramPath(configuration);
File exeFile = exePath != null ? exePath.toFile() : null;
ICDISession session = debugger.createSession(launch, exeFile, submonitor.newChild(1));
ICProject project = CDebugUtils.verifyCProject(configuration);
IPath exePath = CDebugUtils.verifyProgramPath(configuration);
ICDISession session = debugger.createSession(launch, null, submonitor.newChild(1));
IBinaryObject exeBinary = null;
if ( exePath != null ) {
exeBinary = verifyBinary(project, exePath);

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007 - 2008 QNX Software Systems and others.
* Copyright (c) 2007 - 2010 QNX Software Systems 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
@ -52,15 +52,33 @@ public interface IGDBJtagConstants {
public static final String ATTR_STOP_AT = Activator.PLUGIN_ID + ".stopAt"; //$NON-NLS-1$
public static final String ATTR_SET_RESUME = Activator.PLUGIN_ID + ".setResume"; //$NON-NLS-1$
public static final String ATTR_RUN_COMMANDS = Activator.PLUGIN_ID + ".runCommands"; //$NON-NLS-1$
/** @since 7.0 */ public static final String ATTR_USE_PROJ_BINARY_FOR_IMAGE = Activator.PLUGIN_ID + ".useProjBinaryForImage"; //$NON-NLS-1$
/** @since 7.0 */ public static final String ATTR_USE_FILE_FOR_IMAGE = Activator.PLUGIN_ID + ".useFileForImage"; //$NON-NLS-1$
/** @since 7.0 */ public static final String ATTR_USE_PROJ_BINARY_FOR_SYMBOLS = Activator.PLUGIN_ID + ".useProjBinaryForSymbols"; //$NON-NLS-1$
/** @since 7.0 */ public static final String ATTR_USE_FILE_FOR_SYMBOLS = Activator.PLUGIN_ID + ".useFileForSymbols"; //$NON-NLS-1$
public static final boolean DEFAULT_DO_RESET = true;
public static final boolean DEFAULT_DO_HALT = true;
public static final int DEFAULT_DELAY = 3;
public static final boolean DEFAULT_LOAD_IMAGE = false;
public static final boolean DEFAULT_LOAD_SYMBOLS = false;
public static final boolean DEFAULT_LOAD_IMAGE = true;
public static final boolean DEFAULT_LOAD_SYMBOLS = true;
public static final boolean DEFAULT_SET_PC_REGISTER = false;
public static final boolean DEFAULT_SET_STOP_AT = false;
public static final boolean DEFAULT_SET_RESUME = false;
public static final boolean DEFAULT_USE_DEFAULT_RUN = true;
/** @since 7.0 */ public static final String DEFAULT_INIT_COMMANDS = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final String DEFAULT_IMAGE_FILE_NAME = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final String DEFAULT_SYMBOLS_FILE_NAME = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final String DEFAULT_RUN_COMMANDS = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final boolean DEFAULT_USE_PROJ_BINARY_FOR_IMAGE = true;
/** @since 7.0 */ public static final boolean DEFAULT_USE_FILE_FOR_IMAGE = false;
/** @since 7.0 */ public static final boolean DEFAULT_USE_PROJ_BINARY_FOR_SYMBOLS = true;
/** @since 7.0 */ public static final boolean DEFAULT_USE_FILE_FOR_SYMBOLS = false;
/** @since 7.0 */ public static final String DEFAULT_IMAGE_OFFSET = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final String DEFAULT_SYMBOLS_OFFSET = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final String DEFAULT_PC_REGISTER = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final String DEFAULT_STOP_AT = ""; //$NON-NLS-1$
/** @since 7.0 */ public static final String DEFAULT_JTAG_DEVICE = ""; //$NON-NLS-1$
}

View file

@ -1,5 +1,5 @@
###############################################################################
# Copyright (c) 2008 QNX Software Systems and others.
# Copyright (c) 2008 - 2010 QNX Software Systems 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
@ -15,5 +15,9 @@ GDBJtagDebugger.2=Connecting to remote
GDBJtagDebugger.21=GDB command:
GDBJtagDebugger.22=Failed command
GDBJtagDebugger.3=Executing init commands
GDBJtagDebugger.5=Loading image
GDBJtagDebugger.loading_image=Loading image
GDBJtagDebugger.loading_symbols=Loading symbolics
src.common.No_answer=No answer
GDBJtagDebugger.err_no_sym_file=Symbolics loading was requested but file was not specified or not found.
GDBJtagDebugger.err_no_img_file=Image loading was requested but file was not specified or not found.

View file

@ -77,8 +77,19 @@ public class DefaultGDBJtagDeviceImpl implements IGDBJtagDevice {
*/
public void doLoadImage(String imageFileName, String imageOffset, Collection<String> commands) {
String file = escapeScpaces(imageFileName);
String cmd = "restore " + file + " " + imageOffset; //$NON-NLS-1$ //$NON-NLS-2$
addCmd(commands, cmd);
if (imageOffset.length() > 0) {
// 'restore' simply puts the program into memory.
addCmd(commands, "restore " + file + " " + imageOffset);
}
else {
// 'load' puts the program into memory and sets the PC. To see why
// we do this when no offset is specified, see
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=310304#c20
addCmd(commands, "load " + file);
}
// 'exec-file' specifies the program as the context for getting memory.
// Basically, it tells gdb "this is the program we'll be debugging"
addCmd(commands, "exec-file " + file);
}
/* (non-Javadoc)
@ -86,8 +97,12 @@ public class DefaultGDBJtagDeviceImpl implements IGDBJtagDevice {
*/
public void doLoadSymbol(String symbolFileName, String symbolOffset, Collection<String> commands) {
String file = escapeScpaces(symbolFileName);
String cmd = "add-sym " + file + " " + symbolOffset; //$NON-NLS-1$ //$NON-NLS-2$
addCmd(commands, cmd);
if (symbolOffset == null || (symbolOffset.length() == 0)) {
addCmd(commands, "symbol-file " + file);
}
else {
addCmd(commands, "add-sym " + file + " " + symbolOffset);
}
}
protected String escapeScpaces(String file) {

View file

@ -159,7 +159,7 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab {
gdbCommand.setLayoutData(gd);
gdbCommand.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
@ -216,7 +216,7 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab {
jtagDevice.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateDeviceIpPort(jtagDevice.getText());
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
@ -275,7 +275,7 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab {
ipAddress.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
portNumber.addVerifyListener(new VerifyListener() {
@ -285,13 +285,13 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab {
});
portNumber.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
connection.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
}

View file

@ -160,7 +160,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab {
gdbCommand.setLayoutData(gd);
gdbCommand.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
@ -200,7 +200,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab {
commandFactory.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
commandFactoryChanged();
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
}
@ -215,7 +215,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab {
miProtocol = new Combo(comp, SWT.READ_ONLY | SWT.DROP_DOWN);
miProtocol.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
}
@ -285,7 +285,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab {
jtagDevice.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateDeviceIpPort(jtagDevice.getText());
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
@ -344,7 +344,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab {
ipAddress.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
portNumber.addVerifyListener(new VerifyListener() {
@ -354,13 +354,13 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab {
});
portNumber.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
connection.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob(); // provides much better performance for Text listeners
}
});
}

View file

@ -15,7 +15,7 @@ package org.eclipse.cdt.debug.gdbjtag.ui;
import java.io.File;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConstants;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
@ -33,6 +33,7 @@ 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.events.SelectionListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Image;
@ -82,6 +83,16 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
boolean resume = false;
Text runCommands;
// New GUI added to address bug 310304
private Button useProjectBinaryForImage;
private Button useFileForImage;
private Button useProjectBinaryForSymbols;
private Button useFileForSymbols;
private Label imageOffsetLabel;
private Label symbolsOffsetLabel;
private Label projBinaryLabel1;
private Label projBinaryLabel2;
public String getName() {
return TAB_NAME;
@ -170,7 +181,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
});
delay.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
@ -197,7 +208,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
initCommands.setLayoutData(gd);
initCommands.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent evt) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
@ -231,15 +242,42 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
comp.setLayout(layout);
Label imageLabel = new Label(comp, SWT.NONE);
imageLabel.setText(Messages.getString("GDBJtagStartupTab.imageLabel_Text"));
SelectionListener radioButtonListener = new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
updateLaunchConfigurationDialog();
updateUseFileEnablement();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
};
useProjectBinaryForImage = new Button(comp, SWT.RADIO);
useProjectBinaryForImage.setText(Messages.getString("GDBJtagStartupTab.useProjectBinary_Label"));
useProjectBinaryForImage.setToolTipText(Messages.getString("GDBJtagStartupTab.useProjectBinary_ToolTip"));
gd = new GridData();
gd.horizontalSpan = 1;
useProjectBinaryForImage.setLayoutData(gd);
useProjectBinaryForImage.addSelectionListener(radioButtonListener);
projBinaryLabel1 = new Label(comp, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
projBinaryLabel1.setLayoutData(gd);
useFileForImage = new Button(comp, SWT.RADIO);
useFileForImage.setText(Messages.getString("GDBJtagStartupTab.useFile_Label"));
gd = new GridData();
gd.horizontalSpan = 1;
useFileForImage.setLayoutData(gd);
useFileForImage.addSelectionListener(radioButtonListener);
imageFileName = new Text(comp, SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
imageFileName.setLayoutData(gd);
imageFileName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
@ -257,7 +295,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
}
});
Label imageOffsetLabel = new Label(comp, SWT.NONE);
imageOffsetLabel = new Label(comp, SWT.NONE);
imageOffsetLabel.setText(Messages.getString("GDBJtagStartupTab.imageOffsetLabel_Text"));
imageOffset = new Text(comp, SWT.BORDER);
gd = new GridData();
@ -271,10 +309,11 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
});
imageOffset.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
loadSymbols = new Button(group, SWT.CHECK);
loadSymbols.setText(Messages.getString("GDBJtagStartupTab.loadSymbols_Text"));
gd = new GridData();
@ -292,16 +331,34 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
layout.numColumns = 4;
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
comp.setLayout(layout);
useProjectBinaryForSymbols = new Button(comp, SWT.RADIO);
useProjectBinaryForSymbols.setText(Messages.getString("GDBJtagStartupTab.useProjectBinary_Label"));
useProjectBinaryForSymbols.setToolTipText(Messages.getString("GDBJtagStartupTab.useProjectBinary_ToolTip"));
gd = new GridData();
gd.horizontalSpan = 1;
useProjectBinaryForSymbols.setLayoutData(gd);
useProjectBinaryForSymbols.addSelectionListener(radioButtonListener);
projBinaryLabel2 = new Label(comp, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
projBinaryLabel2.setLayoutData(gd);
useFileForSymbols = new Button(comp, SWT.RADIO);
useFileForSymbols.setText(Messages.getString("GDBJtagStartupTab.useFile_Label"));
gd = new GridData();
gd.horizontalSpan = 1;
useFileForSymbols.setLayoutData(gd);
useFileForSymbols.addSelectionListener(radioButtonListener);
Label symbolLabel = new Label(comp, SWT.NONE);
symbolLabel.setText(Messages.getString("GDBJtagStartupTab.symbolsLabel_Text"));
symbolsFileName = new Text(comp, SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 1;
symbolsFileName.setLayoutData(gd);
symbolsFileName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
@ -319,7 +376,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
}
});
Label symbolsOffsetLabel = new Label(comp, SWT.NONE);
symbolsOffsetLabel = new Label(comp, SWT.NONE);
symbolsOffsetLabel.setText(Messages.getString("GDBJtagStartupTab.symbolsOffsetLabel_Text"));
symbolsOffset = new Text(comp, SWT.BORDER);
gd = new GridData();
@ -333,12 +390,24 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
});
symbolsOffset.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
}
private void updateUseFileEnablement() {
boolean enabled = loadImage.getSelection() && useFileForImage.getSelection();
imageFileName.setEnabled(enabled);
imageFileBrowseWs.setEnabled(enabled);
imageFileBrowse.setEnabled(enabled);
enabled = loadSymbols.getSelection() && useFileForSymbols.getSelection();
symbolsFileName.setEnabled(enabled);
symbolsFileBrowseWs.setEnabled(enabled);
symbolsFileBrowse.setEnabled(enabled);
}
public void createRunOptionGroup(Composite parent) {
Group group = new Group(parent, SWT.NONE);
GridLayout layout = new GridLayout();
@ -373,7 +442,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
});
pcRegister.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
@ -396,7 +465,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
stopAt.setLayoutData(gd);
stopAt.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
@ -419,18 +488,20 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
private void loadImageChanged() {
boolean enabled = loadImage.getSelection();
imageFileName.setEnabled(enabled);
imageFileBrowseWs.setEnabled(enabled);
imageFileBrowse.setEnabled(enabled);
useProjectBinaryForImage.setEnabled(enabled);
useFileForImage.setEnabled(enabled);
imageOffset.setEnabled(enabled);
imageOffsetLabel.setEnabled(enabled);
updateUseFileEnablement();
}
private void loadSymbolsChanged() {
boolean enabled = loadSymbols.getSelection();
symbolsFileName.setEnabled(enabled);
symbolsFileBrowseWs.setEnabled(enabled);
symbolsFileBrowse.setEnabled(enabled);
useProjectBinaryForSymbols.setEnabled(enabled);
useFileForSymbols.setEnabled(enabled);
symbolsOffset.setEnabled(enabled);
symbolsOffsetLabel.setEnabled(enabled);
updateUseFileEnablement();
}
private void pcRegisterChanged() {
@ -459,7 +530,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
runCommands.setLayoutData(gd);
runCommands.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent evt) {
updateLaunchConfigurationDialog();
scheduleUpdateJob();
}
});
}
@ -474,40 +545,45 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
setMessage(null);
if (loadImage.getSelection()) {
if (imageFileName.getText().trim().length() == 0) {
setErrorMessage(Messages.getString("GDBJtagStartupTab.imageFileName_not_specified"));
return false;
}
String path;
try {
path = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName.getText().trim());
IPath filePath = new Path(path);
if (!filePath.toFile().exists()) {
if (!useProjectBinaryForImage.getSelection()) {
if (imageFileName.getText().trim().length() == 0) {
setErrorMessage(Messages.getString("GDBJtagStartupTab.imageFileName_not_specified"));
return false;
}
try {
String path = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName.getText().trim());
IPath filePath = new Path(path);
if (!filePath.toFile().exists()) {
setErrorMessage(Messages.getString("GDBJtagStartupTab.imageFileName_does_not_exist"));
return false;
}
} catch (CoreException e) { // string substitution throws this if expression doesn't resolve
setErrorMessage(Messages.getString("GDBJtagStartupTab.imageFileName_does_not_exist"));
return false;
}
} catch (CoreException e) {
Activator.getDefault().getLog().log(e.getStatus());
}
} else {
setErrorMessage(null);
}
if (loadSymbols.getSelection()) {
if (symbolsFileName.getText().trim().length() == 0) {
setErrorMessage(Messages.getString("GDBJtagStartupTab.symbolsFileName_not_specified"));
return false;
}
String path;
try {
path = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(symbolsFileName.getText().trim());
IPath filePath = new Path(path);
if (!filePath.toFile().exists()) {
if (!useProjectBinaryForSymbols.getSelection()) {
if (symbolsFileName.getText().trim().length() == 0) {
setErrorMessage(Messages.getString("GDBJtagStartupTab.symbolsFileName_not_specified"));
return false;
}
try {
String path = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(symbolsFileName.getText().trim());
IPath filePath = new Path(path);
if (!filePath.toFile().exists()) {
setErrorMessage(Messages.getString("GDBJtagStartupTab.symbolsFileName_does_not_exist"));
return false;
}
} catch (CoreException e) { // string substitution throws this if expression doesn't resolve
setErrorMessage(Messages.getString("GDBJtagStartupTab.symbolsFileName_does_not_exist"));
return false;
}
} catch (CoreException e) {
Activator.getDefault().getLog().log(e.getStatus());
}
} else {
setErrorMessage(null);
@ -540,72 +616,135 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab {
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog()
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
*/
// protected void updateLaunchConfigurationDialog() {
// super.updateLaunchConfigurationDialog();
// isValid(getLaunchConfigurationDialog());
// }
public void initializeFrom(ILaunchConfiguration configuration) {
try {
initCommands.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, "")); //$NON-NLS-1$
// Initialization Commands
doReset.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_DO_RESET, IGDBJtagConstants.DEFAULT_DO_RESET));
doResetChanged();
doHalt.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_DO_HALT, IGDBJtagConstants.DEFAULT_DO_HALT));
delay.setText(String.valueOf(configuration.getAttribute(IGDBJtagConstants.ATTR_DELAY, IGDBJtagConstants.DEFAULT_DELAY)));
doHalt.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_DO_HALT, IGDBJtagConstants.DEFAULT_DO_HALT));
initCommands.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, IGDBJtagConstants.DEFAULT_INIT_COMMANDS));
// Load Image...
loadImage.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE));
loadImageChanged();
String defaultImageFileName = configuration.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, ""); //$NON-NLS-1$
if (defaultImageFileName.equals("")) {
defaultImageFileName = configuration.getWorkingCopy().getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, ""); //$NON-NLS-1$
}
imageFileName.setText(defaultImageFileName);
imageOffset.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, "")); //$NON-NLS-1$
useProjectBinaryForImage.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_IMAGE, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_IMAGE));
useFileForImage.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_USE_FILE_FOR_IMAGE, IGDBJtagConstants.DEFAULT_USE_FILE_FOR_IMAGE));
imageFileName.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, IGDBJtagConstants.DEFAULT_IMAGE_FILE_NAME));
imageOffset.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_IMAGE_OFFSET));
//.. and Symbols
loadSymbols.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS));
loadSymbolsChanged();
symbolsFileName.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, "")); //$NON-NLS-1$
symbolsOffset.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, "")); //$NON-NLS-1$
useProjectBinaryForSymbols.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_SYMBOLS, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_SYMBOLS));
useFileForSymbols.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_USE_FILE_FOR_SYMBOLS, IGDBJtagConstants.DEFAULT_USE_FILE_FOR_SYMBOLS));
symbolsFileName.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, IGDBJtagConstants.DEFAULT_SYMBOLS_FILE_NAME));
symbolsOffset.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, IGDBJtagConstants.DEFAULT_SYMBOLS_OFFSET));
// Runtime Options
setPcRegister.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_SET_PC_REGISTER, IGDBJtagConstants.DEFAULT_SET_PC_REGISTER));
pcRegisterChanged();
pcRegister.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, "")); //$NON-NLS-1$
pcRegister.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, IGDBJtagConstants.DEFAULT_PC_REGISTER));
setStopAt.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, IGDBJtagConstants.DEFAULT_SET_STOP_AT));
stopAtChanged();
stopAt.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, "")); //$NON-NLS-1$
stopAt.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, IGDBJtagConstants.DEFAULT_STOP_AT));
setResume.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_SET_RESUME, IGDBJtagConstants.DEFAULT_SET_RESUME));
// Run Commands
runCommands.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, IGDBJtagConstants.DEFAULT_RUN_COMMANDS));
String programName = CDebugUtils.getProgramName(configuration);
if (programName != null) {
int lastSlash = programName.indexOf('\\');
if (lastSlash >= 0) {
programName = programName.substring(lastSlash + 1);
}
lastSlash = programName.indexOf('/');
if (lastSlash >= 0) {
programName = programName.substring(lastSlash + 1);
}
projBinaryLabel1.setText(programName);
projBinaryLabel2.setText(programName);
}
doResetChanged();
loadImageChanged();
loadSymbolsChanged();
pcRegisterChanged();
stopAtChanged();
resumeChanged();
runCommands.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, "")); //$NON-NLS-1$)
updateUseFileEnablement();
} catch (CoreException e) {
Activator.getDefault().getLog().log(e.getStatus());
}
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, initCommands.getText());
configuration.setAttribute(IGDBJtagConstants.ATTR_DELAY, Integer.parseInt(delay.getText()));
// Initialization Commands
configuration.setAttribute(IGDBJtagConstants.ATTR_DO_RESET, doReset.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_DELAY, Integer.parseInt(delay.getText()));
configuration.setAttribute(IGDBJtagConstants.ATTR_DO_HALT, doHalt.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, initCommands.getText());
// Load Image...
configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, loadImage.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_IMAGE, useProjectBinaryForImage.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_FILE_FOR_IMAGE, useFileForImage.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, imageFileName.getText().trim());
configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, imageOffset.getText());
//.. and Symbols
configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, loadSymbols.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, symbolsOffset.getText());
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_SYMBOLS, useProjectBinaryForSymbols.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_FILE_FOR_SYMBOLS, useFileForSymbols.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, symbolsFileName.getText().trim());
configuration.setAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, symbolsOffset.getText());
// Runtime Options
configuration.setAttribute(IGDBJtagConstants.ATTR_SET_PC_REGISTER, setPcRegister.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, pcRegister.getText());
configuration.setAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, setStopAt.getSelection());
configuration.setAttribute(IGDBJtagConstants.ATTR_STOP_AT, stopAt.getText());
configuration.setAttribute(IGDBJtagConstants.ATTR_SET_RESUME, setResume.getSelection());
// Run Commands
configuration.setAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, runCommands.getText());
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, ""); //$NON-NLS-1$
configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE);
configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, ""); //$NON-NLS-1$
configuration.setAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, ""); //$NON-NLS-1$
configuration.setAttribute(IGDBJtagConstants.ATTR_DO_RESET, true);
configuration.setAttribute(IGDBJtagConstants.ATTR_DO_HALT, true);
}
// Initialization Commands
configuration.setAttribute(IGDBJtagConstants.ATTR_DO_RESET, IGDBJtagConstants.DEFAULT_DO_RESET);
configuration.setAttribute(IGDBJtagConstants.ATTR_DELAY, IGDBJtagConstants.DEFAULT_DELAY);
configuration.setAttribute(IGDBJtagConstants.ATTR_DO_HALT, IGDBJtagConstants.DEFAULT_DO_HALT);
configuration.setAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, IGDBJtagConstants.DEFAULT_INIT_COMMANDS);
// Load Image...
configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE);
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_IMAGE, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_IMAGE);
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_FILE_FOR_IMAGE, IGDBJtagConstants.DEFAULT_USE_FILE_FOR_IMAGE);
configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, IGDBJtagConstants.DEFAULT_IMAGE_FILE_NAME);
configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, IGDBJtagConstants.DEFAULT_IMAGE_OFFSET);
//.. and Symbols
configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS);
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_PROJ_BINARY_FOR_SYMBOLS, IGDBJtagConstants.DEFAULT_USE_PROJ_BINARY_FOR_SYMBOLS);
configuration.setAttribute(IGDBJtagConstants.ATTR_USE_FILE_FOR_SYMBOLS, IGDBJtagConstants.DEFAULT_USE_FILE_FOR_SYMBOLS);
configuration.setAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, IGDBJtagConstants.DEFAULT_SYMBOLS_FILE_NAME);
configuration.setAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, IGDBJtagConstants.DEFAULT_SYMBOLS_OFFSET);
// Runtime Options
configuration.setAttribute(IGDBJtagConstants.ATTR_SET_PC_REGISTER, IGDBJtagConstants.DEFAULT_SET_PC_REGISTER);
configuration.setAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, IGDBJtagConstants.DEFAULT_PC_REGISTER);
configuration.setAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, IGDBJtagConstants.DEFAULT_SET_STOP_AT);
configuration.setAttribute(IGDBJtagConstants.ATTR_STOP_AT, IGDBJtagConstants.DEFAULT_STOP_AT);
configuration.setAttribute(IGDBJtagConstants.ATTR_SET_RESUME, IGDBJtagConstants.DEFAULT_SET_RESUME);
// Run Commands
configuration.setAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, IGDBJtagConstants.DEFAULT_RUN_COMMANDS);
}
}

View file

@ -31,6 +31,9 @@ GDBJtagStartupTab.symbolsLabel_Text=Symbols file name:
GDBJtagStartupTab.symbolsFileBrowseWs_Title=Select symbols file
GDBJtagStartupTab.symbolsFileBrowse_Title=Select symbols file
GDBJtagStartupTab.symbolsOffsetLabel_Text=Symbols offset (hex):
GDBJtagStartupTab.useProjectBinary_Label=Use project binary:
GDBJtagStartupTab.useFile_Label=Use file:
GDBJtagStartupTab.useProjectBinary_ToolTip=Use C/C++ application specified in the Main tab.
GDBJtagStartupTab.runOptionGroup_Text=Runtime Options
GDBJtagStartupTab.setPcRegister_Text=Set program counter at (hex):

View file

@ -398,7 +398,7 @@ abstract public class AbstractCLaunchDelegate extends LaunchConfigurationDelegat
*/
@Deprecated
protected IFile getProgramFile(ILaunchConfiguration config) throws CoreException {
ICProject cproject = verifyCProject(config);
ICProject cproject = CDebugUtils.verifyCProject(config);
String fileName = CDebugUtils.getProgramName(config);
if (fileName == null) {
abort(LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_not_specified"), null, //$NON-NLS-1$
@ -417,62 +417,18 @@ abstract public class AbstractCLaunchDelegate extends LaunchConfigurationDelegat
return programPath;
}
/**
* @deprecated use {@link CDebugUtils#verifyCProject(ILaunchConfiguration)}
*/
protected ICProject verifyCProject(ILaunchConfiguration config) throws CoreException {
String name = CDebugUtils.getProjectName(config);
if (name == null) {
abort(LaunchMessages.getString("AbstractCLaunchDelegate.C_Project_not_specified"), null, //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROJECT);
}
ICProject cproject = CDebugUtils.getCProject(config);
if (cproject == null) {
IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
if (!proj.exists()) {
abort(
LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_does_not_exist", name), null, //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
} else if (!proj.isOpen()) {
abort(LaunchMessages.getFormattedString("AbstractCLaunchDelegate.Project_NAME_is_closed", name), null, //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
}
abort(LaunchMessages.getString("AbstractCLaunchDelegate.Not_a_C_CPP_project"), null, //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_NOT_A_C_PROJECT);
}
return cproject;
return CDebugUtils.verifyCProject(config);
}
/**
* @deprecated use {@link CDebugUtils#verifyProgramPath(ILaunchConfiguration)
*/
protected IPath verifyProgramPath(ILaunchConfiguration config) throws CoreException {
ICProject cproject = verifyCProject(config);
IPath programPath = CDebugUtils.getProgramPath(config);
if (programPath == null || programPath.isEmpty()) {
abort(LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_not_specified"), null, //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROGRAM);
}
if (!programPath.isAbsolute()) {
IPath location = cproject.getProject().getLocation();
if (location != null) {
programPath = location.append(programPath);
if (!programPath.toFile().exists()) {
// Try the old way, which is required to support linked resources.
IFile projFile = null;
try {
projFile = project.getFile(CDebugUtils.getProgramPath(config));
}
catch (IllegalArgumentException exc) {} // thrown if relative path that resolves to a root file (e.g., "..\somefile")
if (projFile != null && projFile.exists()) {
programPath = projFile.getLocation();
}
}
}
}
if (!programPath.toFile().exists()) {
abort(
LaunchMessages.getString("AbstractCLaunchDelegate.Program_file_does_not_exist"), //$NON-NLS-1$
new FileNotFoundException(
LaunchMessages.getFormattedString(
"AbstractCLaunchDelegate.PROGRAM_PATH_not_found", programPath.toOSString())), //$NON-NLS-1$
ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_EXIST);
}
return programPath;
return CDebugUtils.verifyProgramPath(config);
}
protected IPath verifyProgramFile(ILaunchConfiguration config) throws CoreException {

View file

@ -53,8 +53,8 @@ public class CoreFileLaunchDelegate extends AbstractCLaunchDelegate {
}
try {
monitor.worked(1);
IPath exePath = verifyProgramPath(config);
ICProject project = verifyCProject(config);
IPath exePath = CDebugUtils.verifyProgramPath(config);
ICProject project = CDebugUtils.verifyCProject(config);
IBinaryObject exeFile = verifyBinary(project, exePath);
ICDebugConfiguration debugConfig = getDebugConfig(config);

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2006 QNX Software Systems and others.
* Copyright (c) 2004, 2010 QNX Software Systems 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
@ -62,7 +62,7 @@ public class LocalAttachLaunchDelegate extends AbstractCLaunchDelegate {
}
try {
monitor.worked(1);
ICProject cproject = verifyCProject(config);
ICProject cproject = CDebugUtils.verifyCProject(config);
IPath exePath = CDebugUtils.getProgramPath(config);
if (exePath != null && !exePath.isEmpty()) {
if (!exePath.isAbsolute()) {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2009 QNX Software Systems and others.
* Copyright (c) 2004, 2010 QNX Software Systems 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
@ -23,6 +23,7 @@ import org.eclipse.cdt.core.IProcessList;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDIDebugger;
import org.eclipse.cdt.debug.core.ICDIDebugger2;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
@ -80,7 +81,7 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
}
monitor.worked( 1 );
try {
IPath exePath = verifyProgramPath( config );
IPath exePath = CDebugUtils.verifyProgramPath( config );
File wd = getWorkingDirectory( config );
if ( wd == null ) {
wd = new File( System.getProperty( "user.home", "." ) ); //$NON-NLS-1$ //$NON-NLS-2$
@ -130,8 +131,8 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
monitor.subTask( LaunchMessages.getString( "LocalCDILaunchDelegate.2" ) ); //$NON-NLS-1$
ICDISession dsession = null;
try {
IPath exePath = verifyProgramPath( config );
ICProject project = verifyCProject( config );
IPath exePath = CDebugUtils.verifyProgramPath( config );
ICProject project = CDebugUtils.verifyCProject( config );
IBinaryObject exeFile = null;
if ( exePath != null ) {
exeFile = verifyBinary( project, exePath );
@ -201,11 +202,11 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
}
cancel( "", -1 ); //$NON-NLS-1$
}
IPath exePath = verifyProgramPath( config );
IPath exePath = CDebugUtils.verifyProgramPath( config );
if (exePath == null) {
exePath= getProgramPathForPid(pid);
}
ICProject project = verifyCProject( config );
ICProject project = CDebugUtils.verifyCProject( config );
IBinaryObject exeFile = null;
if ( exePath != null ) {
exeFile = verifyBinary( project, exePath );
@ -273,7 +274,7 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
ICDebugConfiguration debugConfig = getDebugConfig( config );
String path = config.getAttribute( ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, (String)null );
if ( path == null || path.length() == 0) {
ICProject project = verifyCProject( config );
ICProject project = CDebugUtils.verifyCProject( config );
IPath corefile = promptForCoreFilePath( (IProject)project.getResource(), debugConfig );
if ( corefile == null ) {
cancel( LaunchMessages.getString( "LocalCDILaunchDelegate.6" ), ICDTLaunchConfigurationConstants.ERR_NO_COREFILE ); //$NON-NLS-1$
@ -289,8 +290,8 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
cancel( "", -1 ); //$NON-NLS-1$
}
IPath exePath = verifyProgramPath( config );
ICProject project = verifyCProject( config );
IPath exePath = CDebugUtils.verifyProgramPath( config );
ICProject project = CDebugUtils.verifyCProject( config );
IBinaryObject exeFile = null;
if ( exePath != null ) {
exeFile = verifyBinary( project, exePath );
@ -329,8 +330,8 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
private ICDISession launchOldDebugSession( ILaunchConfiguration config, ILaunch launch, ICDIDebugger debugger, IProgressMonitor monitor ) throws CoreException {
IBinaryObject exeFile = null;
IPath exePath = verifyProgramPath( config );
ICProject project = verifyCProject( config );
IPath exePath = CDebugUtils.verifyProgramPath( config );
ICProject project = CDebugUtils.verifyCProject( config );
if ( exePath != null ) {
exeFile = verifyBinary( project, exePath );
}
@ -338,7 +339,7 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
}
private ICDISession launchDebugSession( ILaunchConfiguration config, ILaunch launch, ICDIDebugger2 debugger, IProgressMonitor monitor ) throws CoreException {
IPath path = verifyProgramPath( config );
IPath path = CDebugUtils.verifyProgramPath( config );
File exeFile = path != null ? path.toFile() : null;
return debugger.createSession( launch, exeFile, monitor );
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2006 QNX Software Systems and others.
* Copyright (c) 2005, 2010 QNX Software Systems 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
@ -18,6 +18,7 @@ import java.util.Arrays;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.ICDebugConfiguration;
import org.eclipse.cdt.debug.core.cdi.CDIException;
@ -57,8 +58,8 @@ public class LocalRunLaunchDelegate extends AbstractCLaunchDelegate {
}
try {
monitor.worked(1);
IPath exePath = verifyProgramPath(config);
ICProject project = verifyCProject(config);
IPath exePath = CDebugUtils.verifyProgramPath(config);
ICProject project = CDebugUtils.verifyCProject(config);
if (exePath != null) {
exeFile = verifyBinary(project, exePath);
}