1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-05 16:56:04 +02:00

Added the support of watch expressions.

This commit is contained in:
Mikhail Khodjaiants 2004-05-19 21:12:43 +00:00
parent ad91f39a81
commit 0f32cf8195
12 changed files with 307 additions and 28 deletions

View file

@ -1,3 +1,12 @@
2004-05-19 Mikhail Khodjaiants
Added the support of watch expressions.
* CDIDebugModel.java
* ICStackFrame.java
* CExpressionTarget.java: new
* CDebugTarget.java
* CExpression.java
* CStackFrame.java
2004-05-14 Mikhail Khodjaiants
Update disassembly when source locator is changed.
* Disassembly.java

View file

@ -12,6 +12,10 @@ package org.eclipse.cdt.debug.core;
import java.util.HashMap;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariableObject;
import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
@ -21,12 +25,20 @@ import org.eclipse.cdt.debug.internal.core.breakpoints.CAddressBreakpoint;
import org.eclipse.cdt.debug.internal.core.breakpoints.CFunctionBreakpoint;
import org.eclipse.cdt.debug.internal.core.breakpoints.CLineBreakpoint;
import org.eclipse.cdt.debug.internal.core.breakpoints.CWatchpoint;
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
import org.eclipse.cdt.debug.internal.core.model.CExpression;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IExpression;
/**
* Provides utility methods for creating debug sessions, targets and
@ -349,4 +361,32 @@ public class CDIDebugModel {
}
return null;
}
public static IExpression createExpression( IDebugTarget target, String text ) throws DebugException {
if ( target != null && target instanceof CDebugTarget ) {
try {
ICDIExpression cdiExpression = ((CDebugTarget)target).getCDISession().getExpressionManager().createExpression( text );
return new CExpression( (CDebugTarget)target, cdiExpression );
}
catch( CDIException e ) {
throw new DebugException( new Status( IStatus.ERROR, getPluginIdentifier(), DebugException.TARGET_REQUEST_FAILED, e.getMessage(), null ) );
}
}
return null;
}
public static IExpression createExpressionForGlobalVariable( IDebugTarget target, IPath fileName, String name ) throws DebugException {
if ( target != null && target instanceof CDebugTarget ) {
ICDIVariableObject vo = null;
try {
vo = ((CDebugTarget)target).getCDISession().getVariableManager().getGlobalVariableObject( fileName.lastSegment(), null, name );
ICDIVariable cdiVariable = ((CDebugTarget)target).getCDISession().getVariableManager().createVariable( vo );
return new CExpression( (CDebugTarget)target, cdiVariable );
}
catch( CDIException e ) {
throw new DebugException( new Status( IStatus.ERROR, getPluginIdentifier(), DebugException.TARGET_REQUEST_FAILED, (vo != null) ? vo.getName() + ": " + e.getMessage() : e.getMessage(), null ) ); //$NON-NLS-1$
}
}
return null;
}
}

View file

@ -10,7 +10,9 @@
***********************************************************************/
package org.eclipse.cdt.debug.core.model;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IValue;
/**
* C/C++ extension of <code>IStackFrame</code>.
@ -54,4 +56,13 @@ public interface ICStackFrame extends IStackFrame, ICDebugElement {
* @return the level of this stack frame
*/
public int getLevel();
/**
* Evaluates the given expression in the context of this stack frame.
*
* @param expression expression to evaluate
* @return the evaluation result
* @throws DebugException if this method fails.
*/
public IValue evaluateExpression( String expression ) throws DebugException;
}

View file

@ -0,0 +1,56 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.debug.internal.core;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
import org.eclipse.cdt.debug.internal.core.model.CExpression;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IValue;
/**
* Implements the expression evaluation target.
*/
public class CExpressionTarget {
private CDebugTarget fDebugTarget;
private Map fExpressions = null;
public CExpressionTarget( CDebugTarget target ) {
fDebugTarget = target;
fExpressions = new HashMap( 10 );
}
public CDebugTarget getDebugTarget() {
return fDebugTarget;
}
public IValue evaluateExpression( String expressionText ) throws DebugException {
CExpression expression = (CExpression)fExpressions.remove( expressionText );
if ( expression != null ) {
expression.dispose();
}
expression = (CExpression)CDIDebugModel.createExpression( getDebugTarget(), expressionText );
fExpressions.put( expressionText, expression );
return expression.getValue();
}
public void dispose() {
Iterator it = fExpressions.values().iterator();
while( it.hasNext() ) {
((CExpression)it.next()).dispose();
}
fExpressions.clear();
}
}

View file

@ -74,6 +74,7 @@ import org.eclipse.cdt.debug.core.model.IRunToLine;
import org.eclipse.cdt.debug.core.model.IState;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.internal.core.CBreakpointManager;
import org.eclipse.cdt.debug.internal.core.CExpressionTarget;
import org.eclipse.cdt.debug.internal.core.CMemoryManager;
import org.eclipse.cdt.debug.internal.core.CRegisterManager;
import org.eclipse.cdt.debug.internal.core.CSharedLibraryManager;
@ -162,11 +163,6 @@ public class CDebugTarget extends CDebugElement
*/
private IProcess fDebuggeeProcess = null;
/**
* Associated debugger process, or <code>null</code> if not available.
*/
// private IProcess fDebuggerProcess = null;
/**
* The underlying CDI target.
*/
@ -252,10 +248,7 @@ public class CDebugTarget extends CDebugElement
*/
private CBreakpointManager fBreakpointManager;
/**
* Whether the debugger process is default.
*/
// private boolean fIsDebuggerProcessDefault = false;
private CExpressionTarget fExpressionTarget;
/**
* The suspension thread.
@ -1002,6 +995,8 @@ public class CDebugTarget extends CDebugElement
return getSignalManager();
if ( adapter.equals( ICRegisterManager.class ) )
return getRegisterManager();
if ( adapter.equals( CExpressionTarget.class ) )
return getExpressionTarget();
if ( adapter.equals( ICDISession.class ) )
return getCDISession();
return super.getAdapter( adapter );
@ -1238,6 +1233,7 @@ public class CDebugTarget extends CDebugElement
disposeDisassembly();
disposeSourceManager();
disposeBreakpointManager();
disposeExpresionTarget();
removeAllExpressions();
disposePreferences();
}
@ -2238,6 +2234,12 @@ public class CDebugTarget extends CDebugElement
}
}
private void disposeExpresionTarget() {
if ( fExpressionTarget != null ) {
fExpressionTarget.dispose();
fExpressionTarget = null;
}
}
protected RunningInfo getRunningInfo()
{
return fRunningInfo;
@ -2479,4 +2481,11 @@ public class CDebugTarget extends CDebugElement
if ( fPreferences!= null )
fPreferences.removePropertyChangeListener( listener );
}
protected CExpressionTarget getExpressionTarget() {
if ( fExpressionTarget == null ) {
fExpressionTarget = new CExpressionTarget( this );
}
return fExpressionTarget;
}
}

View file

@ -12,8 +12,10 @@ import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariableObject;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IValue;
@ -81,11 +83,21 @@ public class CExpression extends CModificationVariable
public void dispose()
{
super.dispose();
try {
ICDIExpression cdiExpression = getCDIExpression();
if ( cdiExpression != null ) {
getCDISession().getExpressionManager().destroyExpression( cdiExpression );
}
}
catch( CDIException e ) {
DebugPlugin.log( e );
}
}
protected ICDIExpression getCDIExpression() throws CDIException
{
return (ICDIExpression)getCDIVariable();
ICDIVariable var = getCDIVariable();
return ( var instanceof ICDIExpression ) ? (ICDIExpression)var : null;
}
/**

View file

@ -11,7 +11,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDILocation;
@ -26,12 +26,15 @@ import org.eclipse.cdt.debug.core.model.IRunToAddress;
import org.eclipse.cdt.debug.core.model.IRunToLine;
import org.eclipse.cdt.debug.core.model.IStackFrameInfo;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.internal.core.CExpressionTarget;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IRegisterGroup;
import org.eclipse.debug.core.model.ISourceLocator;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
/**
@ -796,4 +799,12 @@ public class CStackFrame extends CDebugElement
((IResumeWithoutSignal)getDebugTarget()).resumeWithoutSignal();
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICStackFrame#evaluateExpression(java.lang.String)
*/
public IValue evaluateExpression( String expression ) throws DebugException {
CExpressionTarget target = (CExpressionTarget)getDebugTarget().getAdapter( CExpressionTarget.class );
return ( target != null ) ? target.evaluateExpression( expression ) : null;
}
}

View file

@ -1,3 +1,10 @@
2004-05-19 Mikhail Khodjaiants
Added the support of watch expressions.
* CDTDebugModelPresentation.java
* CWatchExpressionDelegate.java: new
* CDebugUIPluginResources.properties
* plugin.xml
2004-05-14 Mikhail Khodjaiants
Refresh the Disassembly view on change events.
* DisassemblyEditorInput.java

View file

@ -1301,5 +1301,11 @@
</description>
</fontDefinition>
</extension>
<extension
point="org.eclipse.debug.core.watchExpressionDelegates">
<watchExpressionDelegate
debugModel="org.eclipse.cdt.debug.core"
delegateClass="org.eclipse.cdt.debug.internal.ui.CWatchExpressionDelegate"/>
</extension>
</plugin>

View file

@ -59,6 +59,9 @@ import org.eclipse.debug.core.model.ITerminate;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.core.model.IWatchExpression;
import org.eclipse.debug.internal.ui.DebugUIMessages;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IDebugUIConstants;
@ -176,8 +179,7 @@ public class CDTDebugModelPresentation extends LabelProvider
{
if ( ((EditorInputDelegate)input).getDelegate() == null )
return CDebugEditor.EDITOR_ID;
else
return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
return getEditorId( ((EditorInputDelegate)input).getDelegate(), element );
}
String id = null;
@ -215,6 +217,8 @@ public class CDTDebugModelPresentation extends LabelProvider
break;
}
}
if ( element instanceof IWatchExpression && ((IWatchExpression)element).hasErrors() )
overlays[OverlayImageDescriptor.BOTTOM_LEFT] = CDebugImages.DESC_OVRS_ERROR;
if ( element instanceof ICVariable && ((ICVariable)element).isArgument() )
overlays[OverlayImageDescriptor.TOP_RIGHT] = CDebugImages.DESC_OVRS_ARGUMENT;
@ -238,10 +242,7 @@ public class CDTDebugModelPresentation extends LabelProvider
{
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED ) );
}
else
{
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET ) );
}
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_DEBUG_TARGET ) );
}
if ( element instanceof IThread )
{
@ -338,6 +339,11 @@ public class CDTDebugModelPresentation extends LabelProvider
return label.toString();
}
if ( element instanceof IWatchExpression )
{
return getWatchExpressionText( (IWatchExpression)element );
}
if ( element instanceof IVariable )
{
label.append( getVariableText( (IVariable)element ) );
@ -401,7 +407,7 @@ public class CDTDebugModelPresentation extends LabelProvider
CDebugUIPlugin.log( e );
}
return null;
return getDefaultText( element );
}
protected boolean isShowQualifiedNames()
@ -554,6 +560,27 @@ public class CDTDebugModelPresentation extends LabelProvider
return DUMMY_STACKFRAME_LABEL;
}
protected String getWatchExpressionText( IWatchExpression expression ) {
StringBuffer result = new StringBuffer();
result.append( '"' ).append( expression.getExpressionText() ).append( '"' );
if ( expression.isPending() ) {
result.append( " = " ).append( "..." ); //$NON-NLS-1$//$NON-NLS-2$
}
else {
IValue value = expression.getValue();
if ( value != null ) {
String valueString = DebugUIPlugin.getModelPresentation().getText( value );
if ( valueString.length() > 0 ) {
result.append( " = " ).append( valueString ); //$NON-NLS-1$
}
}
}
if ( !expression.isEnabled() ) {
result.append( CDebugUIPlugin.getResourceString( "internal.ui.CDTDebugModelPresentation.disabled" ) ); //$NON-NLS-1$
}
return result.toString();
}
protected String getVariableText( IVariable var ) throws DebugException
{
StringBuffer label = new StringBuffer();
@ -587,8 +614,6 @@ public class CDTDebugModelPresentation extends LabelProvider
label.append( ' ' );
}
}
if ( !((ICVariable)var).isEnabled() )
label.append( CDebugUIPlugin.getResourceString("internal.ui.CDTDebugModelPresentation.disabled") ); //$NON-NLS-1$
String name = var.getName();
if ( name != null )
label.append( name.trim() );
@ -625,10 +650,12 @@ public class CDTDebugModelPresentation extends LabelProvider
}
}
}
if ( !((ICVariable)var).isEnabled() )
label.append( CDebugUIPlugin.getResourceString("internal.ui.CDTDebugModelPresentation.disabled") ); //$NON-NLS-1$
return label.toString();
}
protected String getSharedLibraryText( ICSharedLibrary library, boolean qualified ) throws DebugException
protected String getSharedLibraryText( ICSharedLibrary library, boolean qualified )
{
String label = new String();
IPath path = new Path( library.getFileName() );
@ -774,7 +801,7 @@ public class CDTDebugModelPresentation extends LabelProvider
return label.toString();
}
protected StringBuffer appendResourceName( ICBreakpoint breakpoint, StringBuffer label, boolean qualified ) throws CoreException
protected StringBuffer appendResourceName( ICBreakpoint breakpoint, StringBuffer label, boolean qualified )
{
IPath path = breakpoint.getMarker().getResource().getLocation();
if ( !path.isEmpty() )
@ -897,7 +924,7 @@ public class CDTDebugModelPresentation extends LabelProvider
return overlays;
}
protected Image getVariableImage( IVariable element ) throws DebugException
protected Image getVariableImage( IVariable element )
{
if ( element instanceof ICVariable )
{
@ -923,22 +950,22 @@ public class CDTDebugModelPresentation extends LabelProvider
return null;
}
protected Image getRegisterGroupImage( IRegisterGroup element ) throws DebugException
protected Image getRegisterGroupImage( IRegisterGroup element )
{
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER_GROUP );
}
protected Image getRegisterImage( IRegister element ) throws DebugException
protected Image getRegisterImage( IRegister element )
{
return fDebugImageRegistry.get( CDebugImages.DESC_OBJS_REGISTER );
}
protected Image getExpressionImage( IExpression element ) throws DebugException
protected Image getExpressionImage( IExpression element )
{
return fDebugImageRegistry.get( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_EXPRESSION ) );
}
protected Image getSharedLibraryImage( ICSharedLibrary element ) throws DebugException
protected Image getSharedLibraryImage( ICSharedLibrary element )
{
if ( element.areSymbolsLoaded() )
{
@ -972,4 +999,18 @@ public class CDTDebugModelPresentation extends LabelProvider
{
return ( str == null || str.length() == 0 );
}
/**
* Returns a default text label for the debug element
*/
protected String getDefaultText(Object element) {
return DebugUIPlugin.getDefaultLabelProvider().getText( element );
}
/**
* Returns a default image for the debug element
*/
protected Image getDefaultImage(Object element) {
return DebugUIPlugin.getDefaultLabelProvider().getImage( element );
}
}

View file

@ -0,0 +1,77 @@
/**********************************************************************
* Copyright (c) 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.debug.internal.ui;
import org.eclipse.cdt.debug.core.model.ICStackFrame;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IWatchExpressionDelegate;
import org.eclipse.debug.core.model.IWatchExpressionListener;
import org.eclipse.debug.core.model.IWatchExpressionResult;
public class CWatchExpressionDelegate implements IWatchExpressionDelegate {
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IWatchExpressionDelegate#evaluateExpression(java.lang.String, org.eclipse.debug.core.model.IDebugElement, org.eclipse.debug.core.model.IWatchExpressionListener)
*/
public void evaluateExpression( final String expression, IDebugElement context, final IWatchExpressionListener listener ) {
if ( !(context instanceof ICStackFrame) ) {
listener.watchEvaluationFinished( null );
return;
}
final ICStackFrame frame = (ICStackFrame)context;
Runnable runnable = new Runnable() {
public void run() {
IValue value = null;
DebugException de = null;
try {
value = frame.evaluateExpression( expression );
}
catch( DebugException e ) {
de = e;
}
IWatchExpressionResult result = evaluationComplete( expression, value, de );
listener.watchEvaluationFinished( result );
}
};
DebugPlugin.getDefault().asyncExec( runnable );
}
protected IWatchExpressionResult evaluationComplete( final String expression, final IValue value, final DebugException de ) {
return new IWatchExpressionResult() {
public IValue getValue() {
return value;
}
public boolean hasErrors() {
return ( de != null );
}
public String getExpressionText() {
return expression;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IWatchExpressionResult#getException()
*/
public DebugException getException() {
return de;
}
public String[] getErrorMessages() {
return ( de != null ) ? new String[] { de.getMessage() } : new String[0];
}
};
}
}

View file

@ -244,7 +244,7 @@ internal.ui.CDTDebugModelPresentation.threadName_Stepping={0} (Stepping)
internal.ui.CDTDebugModelPresentation.threadName_Running={0} (Running)
internal.ui.CDTDebugModelPresentation.Thread_threadName_suspended=Thread [{0}] (Suspended)
internal.ui.CDTDebugModelPresentation.Symbol_not_available=<symbol is not available>
internal.ui.CDTDebugModelPresentation.disabled=<disabled>
internal.ui.CDTDebugModelPresentation.disabled=\ (disabled)
internal.ui.CDTDebugModelPresentation.Infinity=Infinity
internal.ui.CDTDebugModelPresentation.line=line:
internal.ui.CDTDebugModelPresentation.function=function: