1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-29 20:05:35 +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; package org.eclipse.cdt.debug.mi.core.cdi.model;
import java.io.File;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDIAddressLocation; import org.eclipse.cdt.debug.core.cdi.ICDIAddressLocation;
import org.eclipse.cdt.debug.core.cdi.ICDICondition; 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.ICDIFunctionLocation;
import org.eclipse.cdt.debug.core.cdi.ICDILineLocation; import org.eclipse.cdt.debug.core.cdi.ICDILineLocation;
import org.eclipse.cdt.debug.core.cdi.ICDILocation; 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 { public void stepUntil(ICDILocation location) throws CDIException {
CommandFactory factory = miSession.getCommandFactory(); CommandFactory factory = miSession.getCommandFactory();
String loc = null; 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) { if (location instanceof ICDILineLocation) {
ICDILineLocation lineLocation = (ICDILineLocation)location; ICDILineLocation lineLocation = (ICDILineLocation)location;
if (lineLocation.getFile() != null && lineLocation.getFile().length() > 0) { if (file != null) {
loc = lineLocation.getFile() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$ loc = file.getName() + ":" + lineLocation.getLineNumber(); //$NON-NLS-1$
} }
} else if (location instanceof ICDIFunctionLocation) { } else if (location instanceof ICDIFunctionLocation) {
ICDIFunctionLocation funcLocation = (ICDIFunctionLocation)location; ICDIFunctionLocation funcLocation = (ICDIFunctionLocation)location;
if (funcLocation.getFunction() != null && funcLocation.getFunction().length() > 0) { if (funcLocation.getFunction() != null && funcLocation.getFunction().length() > 0) {
loc = funcLocation.getFunction(); loc = funcLocation.getFunction();
} }
if (funcLocation.getFile() != null && funcLocation.getFile().length() > 0) { if (file != null && loc != null) {
if (loc != null) { loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
loc = funcLocation.getFile() + ":" + loc; //$NON-NLS-1$
}
} }
} else if (location instanceof ICDIAddressLocation) { } else if (location instanceof ICDIAddressLocation) {
ICDIAddressLocation addrLocation = (ICDIAddressLocation)location; 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) * @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.ICDILocation)
*/ */
public void resume(ICDILocation location) throws CDIException { 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) /* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.model.ICDISignal) * @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 { 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) /* (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$ throw new CDIException(CdiResources.getString("cdi.model.Target.Inferior_already_running")); //$NON-NLS-1$
} else if (miSession.getMIInferior().isSuspended()) { } else if (miSession.getMIInferior().isSuspended()) {
if (passSignal) { 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 { } else {
continuation(); continuation();
} }
@ -722,78 +789,21 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#jump(ICDILocation) * @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#jump(ICDILocation)
*/ */
public void jump(ICDILocation location) throws CDIException { public void jump(ICDILocation location) throws CDIException {
CommandFactory factory = miSession.getCommandFactory(); resume(location);
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);
}
} }
/** /**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal() * @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal()
*/ */
public void signal() throws CDIException { public void signal() throws CDIException {
CommandFactory factory = miSession.getCommandFactory(); resume(true);
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);
}
} }
/** /**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal(ICDISignal) * @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#signal(ICDISignal)
*/ */
public void signal(ICDISignal signal) throws CDIException { public void signal(ICDISignal signal) throws CDIException {
CommandFactory factory = miSession.getCommandFactory(); resume(signal);
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);
}
} }
public String evaluateExpressionToString(ICDIStackFrame frame, String expressionText) throws CDIException { 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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* QNX Software Systems - Initial API and implementation * 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; 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.IJumpToAddress;
import org.eclipse.cdt.debug.core.model.IJumpToLine; import org.eclipse.cdt.debug.core.model.IJumpToLine;
import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants; 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.IInternalCDebugUIConstants;
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyEditorInput; 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.internal.ui.views.disassembly.DisassemblyView;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin; 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.debug.core.model.ISuspendResume;
import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.ITextSelection;
@ -60,17 +67,22 @@ public class ResumeAtLineAdapter implements IResumeAtLineTarget {
errorMessage = ActionMessages.getString( "ResumeAtLineAdapter.1" ); //$NON-NLS-1$ errorMessage = ActionMessages.getString( "ResumeAtLineAdapter.1" ); //$NON-NLS-1$
} }
else { 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; ITextSelection textSelection = (ITextSelection)selection;
final int lineNumber = textSelection.getStartLine() + 1; final int lineNumber = textSelection.getStartLine() + 1;
if ( target instanceof IAdaptable ) { if ( target instanceof IAdaptable ) {
final IJumpToLine jumpToLine = (IJumpToLine)((IAdaptable)target).getAdapter( IJumpToLine.class ); 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() { Runnable r = new Runnable() {
public void run() { public void run() {
try { try {
jumpToLine.jumpToLine( fileName, lineNumber ); jumpToLine.jumpToLine( path.toPortableString(), lineNumber );
} }
catch( DebugException e ) { catch( DebugException e ) {
failed( e ); failed( e );
@ -141,16 +153,21 @@ public class ResumeAtLineAdapter implements IResumeAtLineTarget {
if ( document == null ) { if ( document == null ) {
return false; return false;
} }
String fileName; String fileName; // actually, absolute path, not just file name
try { try {
fileName = getFileName( input ); fileName = getFileName( input );
} }
catch( CoreException e ) { catch( CoreException e ) {
return false; 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; ITextSelection textSelection = (ITextSelection)selection;
int lineNumber = textSelection.getStartLine() + 1; int lineNumber = textSelection.getStartLine() + 1;
return jumpToLine.canJumpToLine( fileName, lineNumber ); return jumpToLine.canJumpToLine( path.toPortableString(), lineNumber );
} }
if ( part instanceof DisassemblyView ) { if ( part instanceof DisassemblyView ) {
IJumpToAddress jumpToAddress = (IJumpToAddress)((IAdaptable)target).getAdapter( IJumpToAddress.class ); IJumpToAddress jumpToAddress = (IJumpToAddress)((IAdaptable)target).getAdapter( IJumpToAddress.class );
@ -171,10 +188,10 @@ public class ResumeAtLineAdapter implements IResumeAtLineTarget {
private String getFileName( IEditorInput input ) throws CoreException { private String getFileName( IEditorInput input ) throws CoreException {
if ( input instanceof IFileEditorInput ) { if ( input instanceof IFileEditorInput ) {
return ((IFileEditorInput)input).getFile().getName(); return ((IFileEditorInput)input).getFile().getLocation().toOSString();
} }
if ( input instanceof IStorageEditorInput ) { if ( input instanceof IStorageEditorInput ) {
return ((IStorageEditorInput)input).getStorage().getName(); return ((IStorageEditorInput)input).getStorage().getFullPath().toOSString();
} }
return null; 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 ) ); ms.add( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, e.getMessage(), e ) );
CDebugUtils.error( ms, this ); 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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* QNX Software Systems - Initial API and implementation * 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; package org.eclipse.cdt.debug.internal.ui.actions;