1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 01:15:29 +02:00

Bug 186929: Run to Line and Resume At Line should be passing absolute path to CDI client.

This commit is contained in:
Mikhail Khodjaiants 2007-06-12 16:01:28 +00:00
parent 81aa5dcb4d
commit 9a64852657
3 changed files with 122 additions and 78 deletions

View file

@ -11,6 +11,7 @@
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi.model;
import java.io.File;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@ -19,6 +20,7 @@ import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDIAddressLocation;
import org.eclipse.cdt.debug.core.cdi.ICDICondition;
import org.eclipse.cdt.debug.core.cdi.ICDIFileLocation;
import org.eclipse.cdt.debug.core.cdi.ICDIFunctionLocation;
import org.eclipse.cdt.debug.core.cdi.ICDILineLocation;
import org.eclipse.cdt.debug.core.cdi.ICDILocation;
@ -577,20 +579,24 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
public void stepUntil(ICDILocation location) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
String loc = null;
File file = null;
if (location instanceof ICDIFileLocation) {
String filePath = ((ICDIFileLocation)location).getFile();
if (filePath != null && filePath.length() > 0)
file = new File(filePath);
}
if (location instanceof ICDILineLocation) {
ICDILineLocation lineLocation = (ICDILineLocation)location;
if (lineLocation.getFile() != null && lineLocation.getFile().length() > 0) {
loc = lineLocation.getFile() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
if (file != null) {
loc = file.getName() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
}
} else if (location instanceof ICDIFunctionLocation) {
ICDIFunctionLocation funcLocation = (ICDIFunctionLocation)location;
if (funcLocation.getFunction() != null && funcLocation.getFunction().length() > 0) {
loc = funcLocation.getFunction();
}
if (funcLocation.getFile() != null && funcLocation.getFile().length() > 0) {
if (loc != null) {
loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
}
if (file != null && loc != null) {
loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
}
} else if (location instanceof ICDIAddressLocation) {
ICDIAddressLocation addrLocation = (ICDIAddressLocation)location;
@ -675,14 +681,65 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.ICDILocation)
*/
public void resume(ICDILocation location) throws CDIException {
jump(location);
CommandFactory factory = miSession.getCommandFactory();
String loc = null;
File file = null;
if (location instanceof ICDIFileLocation) {
String filePath = ((ICDIFileLocation)location).getFile();
if (filePath != null && filePath.length() > 0)
file = new File(filePath);
}
if (location instanceof ICDILineLocation) {
ICDILineLocation lineLocation = (ICDILineLocation)location;
if (file != null) {
loc = file.getName() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
}
} else if (location instanceof ICDIFunctionLocation) {
ICDIFunctionLocation funcLocation = (ICDIFunctionLocation)location;
if (funcLocation.getFunction() != null && funcLocation.getFunction().length() > 0) {
loc = funcLocation.getFunction();
}
if (file != null && loc != null) {
loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
}
} else if (location instanceof ICDIAddressLocation) {
ICDIAddressLocation addrLocation = (ICDIAddressLocation)location;
if (!addrLocation.getAddress().equals(BigInteger.ZERO)) {
loc = "*0x" + addrLocation.getAddress().toString(16); //$NON-NLS-1$
}
}
// Throw an exception we do know where to go
if (loc == null) {
throw new CDIException(CdiResources.getString("cdi.mode.Target.Bad_location")); //$NON-NLS-1$
}
CLIJump jump = factory.createCLIJump(loc);
try {
miSession.postCommand(jump);
MIInfo info = jump.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.model.ICDISignal)
*/
public void resume(ICDISignal signal) throws CDIException {
signal(signal);
CommandFactory factory = miSession.getCommandFactory();
CLISignal sig = factory.createCLISignal(signal.getName());
try {
miSession.postCommand(sig);
MIInfo info = sig.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
/* (non-Javadoc)
@ -693,7 +750,17 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
throw new CDIException(CdiResources.getString("cdi.model.Target.Inferior_already_running")); //$NON-NLS-1$
} else if (miSession.getMIInferior().isSuspended()) {
if (passSignal) {
signal();
CommandFactory factory = miSession.getCommandFactory();
CLISignal signal = factory.createCLISignal("0"); //$NON-NLS-1$
try {
miSession.postCommand(signal);
MIInfo info = signal.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
} else {
continuation();
}
@ -722,78 +789,21 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#jump(ICDILocation)
*/
public void jump(ICDILocation location) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
String loc = null;
if (location instanceof ICDILineLocation) {
ICDILineLocation lineLocation = (ICDILineLocation)location;
if (lineLocation.getFile() != null && lineLocation.getFile().length() > 0) {
loc = lineLocation.getFile() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
}
} else if (location instanceof ICDIFunctionLocation) {
ICDIFunctionLocation funcLocation = (ICDIFunctionLocation)location;
if (funcLocation.getFunction() != null && funcLocation.getFunction().length() > 0) {
loc = funcLocation.getFunction();
}
if (funcLocation.getFile() != null && funcLocation.getFile().length() > 0) {
if (loc != null) {
loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
}
}
} else if (location instanceof ICDIAddressLocation) {
ICDIAddressLocation addrLocation = (ICDIAddressLocation)location;
if (!addrLocation.getAddress().equals(BigInteger.ZERO)) {
loc = "*0x" + addrLocation.getAddress().toString(16); //$NON-NLS-1$
}
}
// Throw an exception we do know where to go
if (loc == null) {
throw new CDIException(CdiResources.getString("cdi.mode.Target.Bad_location")); //$NON-NLS-1$
}
CLIJump jump = factory.createCLIJump(loc);
try {
miSession.postCommand(jump);
MIInfo info = jump.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
resume(location);
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal()
*/
public void signal() throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
CLISignal signal = factory.createCLISignal("0"); //$NON-NLS-1$
try {
miSession.postCommand(signal);
MIInfo info = signal.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
resume(true);
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal(ICDISignal)
*/
public void signal(ICDISignal signal) throws CDIException {
CommandFactory factory = miSession.getCommandFactory();
CLISignal sig = factory.createCLISignal(signal.getName());
try {
miSession.postCommand(sig);
MIInfo info = sig.getMIInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
} catch (MIException e) {
throw new MI2CDIException(e);
}
resume(signal);
}
public String evaluateExpressionToString(ICDIStackFrame frame, String expressionText) throws CDIException {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 QNX Software Systems and others.
* Copyright (c) 2004, 2007 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
@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Freescale - https://bugs.eclipse.org/bugs/show_bug.cgi?id=186929
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
@ -16,17 +17,23 @@ import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.model.IJumpToAddress;
import org.eclipse.cdt.debug.core.model.IJumpToLine;
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
import org.eclipse.cdt.debug.internal.core.model.CDebugElement;
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyEditorInput;
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.ISourceLocator;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
@ -60,17 +67,22 @@ public class ResumeAtLineAdapter implements IResumeAtLineTarget {
errorMessage = ActionMessages.getString( "ResumeAtLineAdapter.1" ); //$NON-NLS-1$
}
else {
final String fileName = getFileName( input );
final String fileName = getFileName( input ); // actually, absolute path, not just file name
IDebugTarget debugTarget = null;
if ( target instanceof CDebugElement ) { // should always be, but just in case
debugTarget = ((CDebugElement)target).getDebugTarget();
}
final IPath path = convertPath( fileName, debugTarget );
ITextSelection textSelection = (ITextSelection)selection;
final int lineNumber = textSelection.getStartLine() + 1;
if ( target instanceof IAdaptable ) {
final IJumpToLine jumpToLine = (IJumpToLine)((IAdaptable)target).getAdapter( IJumpToLine.class );
if ( jumpToLine != null && jumpToLine.canJumpToLine( fileName, lineNumber ) ) {
if ( jumpToLine != null && jumpToLine.canJumpToLine( path.toPortableString(), lineNumber ) ) {
Runnable r = new Runnable() {
public void run() {
try {
jumpToLine.jumpToLine( fileName, lineNumber );
jumpToLine.jumpToLine( path.toPortableString(), lineNumber );
}
catch( DebugException e ) {
failed( e );
@ -141,16 +153,21 @@ public class ResumeAtLineAdapter implements IResumeAtLineTarget {
if ( document == null ) {
return false;
}
String fileName;
String fileName; // actually, absolute path, not just file name
try {
fileName = getFileName( input );
}
catch( CoreException e ) {
return false;
}
IDebugTarget debugTarget = null;
if ( target instanceof CDebugElement ) { // should always be, but just in case
debugTarget = ((CDebugElement)target).getDebugTarget();
}
final IPath path = convertPath( fileName, debugTarget );
ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1;
return jumpToLine.canJumpToLine( fileName, lineNumber );
return jumpToLine.canJumpToLine( path.toPortableString(), lineNumber );
}
if ( part instanceof DisassemblyView ) {
IJumpToAddress jumpToAddress = (IJumpToAddress)((IAdaptable)target).getAdapter( IJumpToAddress.class );
@ -171,10 +188,10 @@ public class ResumeAtLineAdapter implements IResumeAtLineTarget {
private String getFileName( IEditorInput input ) throws CoreException {
if ( input instanceof IFileEditorInput ) {
return ((IFileEditorInput)input).getFile().getName();
return ((IFileEditorInput)input).getFile().getLocation().toOSString();
}
if ( input instanceof IStorageEditorInput ) {
return ((IStorageEditorInput)input).getStorage().getName();
return ((IStorageEditorInput)input).getStorage().getFullPath().toOSString();
}
return null;
}
@ -188,4 +205,20 @@ public class ResumeAtLineAdapter implements IResumeAtLineTarget {
ms.add( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, e.getMessage(), e ) );
CDebugUtils.error( ms, this );
}
private IPath convertPath( String sourceHandle, IDebugTarget debugTarget ) {
IPath path = null;
if ( Path.EMPTY.isValidPath( sourceHandle ) ) {
if ( debugTarget != null ) {
ISourceLocator sl = debugTarget.getLaunch().getSourceLocator();
if ( sl instanceof CSourceLookupDirector ) {
path = ((CSourceLookupDirector)sl).getCompilationPath( sourceHandle );
}
}
if ( path == null ) {
path = new Path( sourceHandle );
}
}
return path;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 QNX Software Systems and others.
* Copyright (c) 2004, 2007 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
@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Freescale - https://bugs.eclipse.org/bugs/show_bug.cgi?id=186929
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;