mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-04 14:55:41 +02:00
Support of the thread-specific breakpoints.
Fix for the error handling of the asynchronous operations.
This commit is contained in:
parent
6d4c6092a4
commit
28b6334ebe
3 changed files with 71 additions and 18 deletions
|
@ -14,9 +14,9 @@ import java.math.BigInteger;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.IAddress;
|
import org.eclipse.cdt.core.IAddress;
|
||||||
import org.eclipse.cdt.core.IAddressFactory;
|
import org.eclipse.cdt.core.IAddressFactory;
|
||||||
import org.eclipse.cdt.debug.core.CDIDebugModel;
|
import org.eclipse.cdt.debug.core.CDIDebugModel;
|
||||||
|
@ -40,6 +40,7 @@ import org.eclipse.cdt.debug.core.model.ICBreakpoint;
|
||||||
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
|
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
|
||||||
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
|
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
|
||||||
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
|
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICThread;
|
||||||
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
|
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
|
||||||
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
|
||||||
import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint;
|
import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint;
|
||||||
|
@ -341,16 +342,17 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
ICDITarget cdiTarget = getCDITarget();
|
ICDITarget cdiTarget = getCDITarget();
|
||||||
try {
|
try {
|
||||||
boolean enabled = breakpoint.isEnabled();
|
boolean enabled = breakpoint.isEnabled();
|
||||||
boolean oldEnabled = delta.getAttribute( IBreakpoint.ENABLED, true );
|
boolean oldEnabled = ( delta != null ) ? delta.getAttribute( IBreakpoint.ENABLED, true ) : enabled;
|
||||||
int ignoreCount = breakpoint.getIgnoreCount();
|
int ignoreCount = breakpoint.getIgnoreCount();
|
||||||
int oldIgnoreCount = delta.getAttribute( ICBreakpoint.IGNORE_COUNT, 0 );
|
int oldIgnoreCount = ( delta != null ) ? delta.getAttribute( ICBreakpoint.IGNORE_COUNT, 0 ) : ignoreCount;
|
||||||
String condition = breakpoint.getCondition();
|
String condition = breakpoint.getCondition();
|
||||||
String oldCondition = delta.getAttribute( ICBreakpoint.CONDITION, "" ); //$NON-NLS-1$
|
String oldCondition = ( delta != null ) ? delta.getAttribute( ICBreakpoint.CONDITION, "" ) : condition; //$NON-NLS-1$
|
||||||
|
String[] newThreadIs = getThreadNames( breakpoint );
|
||||||
if ( enabled != oldEnabled ) {
|
if ( enabled != oldEnabled ) {
|
||||||
cdiBreakpoint.setEnabled( enabled );
|
cdiBreakpoint.setEnabled( enabled );
|
||||||
}
|
}
|
||||||
if ( ignoreCount != oldIgnoreCount || !condition.equals( oldCondition ) ) {
|
if ( ignoreCount != oldIgnoreCount || condition.compareTo( oldCondition ) != 0 || areThreadFiltersChanged( newThreadIs, cdiBreakpoint ) ) {
|
||||||
ICDICondition cdiCondition = cdiTarget.createCondition( ignoreCount, condition );
|
ICDICondition cdiCondition = cdiTarget.createCondition( ignoreCount, condition, newThreadIs );
|
||||||
cdiBreakpoint.setCondition( cdiCondition );
|
cdiBreakpoint.setCondition( cdiCondition );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -494,7 +496,7 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
String function = breakpoint.getFunction();
|
String function = breakpoint.getFunction();
|
||||||
String fileName = (function != null && function.indexOf( "::" ) == -1) ? breakpoint.getFileName() : null; //$NON-NLS-1$
|
String fileName = (function != null && function.indexOf( "::" ) == -1) ? breakpoint.getFileName() : null; //$NON-NLS-1$
|
||||||
ICDILocation location = cdiTarget.createLocation( fileName, function, -1 );
|
ICDILocation location = cdiTarget.createLocation( fileName, function, -1 );
|
||||||
ICDICondition condition = cdiTarget.createCondition( breakpoint.getIgnoreCount(), breakpoint.getCondition() );
|
ICDICondition condition = createCondition( breakpoint );
|
||||||
ICDIBreakpoint cdiBreakpoint = null;
|
ICDIBreakpoint cdiBreakpoint = null;
|
||||||
synchronized ( getBreakpointMap() ) {
|
synchronized ( getBreakpointMap() ) {
|
||||||
cdiBreakpoint = cdiTarget.setLocationBreakpoint( ICDIBreakpoint.REGULAR, location, condition, true );
|
cdiBreakpoint = cdiTarget.setLocationBreakpoint( ICDIBreakpoint.REGULAR, location, condition, true );
|
||||||
|
@ -509,7 +511,7 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
String address = breakpoint.getAddress();
|
String address = breakpoint.getAddress();
|
||||||
if ( address.startsWith( "0x" ) ) { //$NON-NLS-1$
|
if ( address.startsWith( "0x" ) ) { //$NON-NLS-1$
|
||||||
ICDILocation location = cdiTarget.createLocation( new BigInteger ( breakpoint.getAddress().substring( 2 ), 16 ) );
|
ICDILocation location = cdiTarget.createLocation( new BigInteger ( breakpoint.getAddress().substring( 2 ), 16 ) );
|
||||||
ICDICondition condition = cdiTarget.createCondition( breakpoint.getIgnoreCount(), breakpoint.getCondition() );
|
ICDICondition condition = createCondition( breakpoint );
|
||||||
synchronized ( getBreakpointMap() ) {
|
synchronized ( getBreakpointMap() ) {
|
||||||
cdiBreakpoint = cdiTarget.setLocationBreakpoint( ICDIBreakpoint.REGULAR, location, condition, true );
|
cdiBreakpoint = cdiTarget.setLocationBreakpoint( ICDIBreakpoint.REGULAR, location, condition, true );
|
||||||
getBreakpointMap().put( breakpoint, cdiBreakpoint );
|
getBreakpointMap().put( breakpoint, cdiBreakpoint );
|
||||||
|
@ -521,7 +523,7 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
private ICDIBreakpoint setLineBreakpoint( ICLineBreakpoint breakpoint ) throws CDIException, CoreException {
|
private ICDIBreakpoint setLineBreakpoint( ICLineBreakpoint breakpoint ) throws CDIException, CoreException {
|
||||||
ICDITarget cdiTarget = getCDITarget();
|
ICDITarget cdiTarget = getCDITarget();
|
||||||
ICDILocation location = cdiTarget.createLocation( breakpoint.getMarker().getResource().getLocation().lastSegment(), null, breakpoint.getLineNumber() );
|
ICDILocation location = cdiTarget.createLocation( breakpoint.getMarker().getResource().getLocation().lastSegment(), null, breakpoint.getLineNumber() );
|
||||||
ICDICondition condition = cdiTarget.createCondition( breakpoint.getIgnoreCount(), breakpoint.getCondition() );
|
ICDICondition condition = createCondition( breakpoint );
|
||||||
ICDIBreakpoint cdiBreakpoint = null;
|
ICDIBreakpoint cdiBreakpoint = null;
|
||||||
synchronized ( getBreakpointMap() ) {
|
synchronized ( getBreakpointMap() ) {
|
||||||
cdiBreakpoint = cdiTarget.setLocationBreakpoint( ICDIBreakpoint.REGULAR, location, condition, true );
|
cdiBreakpoint = cdiTarget.setLocationBreakpoint( ICDIBreakpoint.REGULAR, location, condition, true );
|
||||||
|
@ -536,7 +538,7 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
accessType |= (watchpoint.isWriteType()) ? ICDIWatchpoint.WRITE : 0;
|
accessType |= (watchpoint.isWriteType()) ? ICDIWatchpoint.WRITE : 0;
|
||||||
accessType |= (watchpoint.isReadType()) ? ICDIWatchpoint.READ : 0;
|
accessType |= (watchpoint.isReadType()) ? ICDIWatchpoint.READ : 0;
|
||||||
String expression = watchpoint.getExpression();
|
String expression = watchpoint.getExpression();
|
||||||
ICDICondition condition = cdiTarget.createCondition( watchpoint.getIgnoreCount(), watchpoint.getCondition() );
|
ICDICondition condition = createCondition( watchpoint );
|
||||||
ICDIWatchpoint cdiWatchpoint = null;
|
ICDIWatchpoint cdiWatchpoint = null;
|
||||||
synchronized ( getBreakpointMap() ) {
|
synchronized ( getBreakpointMap() ) {
|
||||||
cdiWatchpoint = cdiTarget.setWatchpoint( ICDIBreakpoint.REGULAR, accessType, expression, condition );
|
cdiWatchpoint = cdiTarget.setWatchpoint( ICDIBreakpoint.REGULAR, accessType, expression, condition );
|
||||||
|
@ -722,4 +724,43 @@ public class CBreakpointManager implements IBreakpointManagerListener, ICDIEvent
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean areThreadFiltersChanged( String[] newIds, ICDIBreakpoint cdiBreakpoint ) {
|
||||||
|
try {
|
||||||
|
String[] oldIds = cdiBreakpoint.getCondition().getThreadIds();
|
||||||
|
if ( oldIds.length != newIds.length )
|
||||||
|
return true;
|
||||||
|
List list = Arrays.asList( oldIds );
|
||||||
|
for ( int i = 0; i < newIds.length; ++i ) {
|
||||||
|
if ( !list.contains( newIds[i] ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CDIException e ) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] getThreadNames( ICBreakpoint breakpoint ) {
|
||||||
|
try {
|
||||||
|
ICThread[] threads = breakpoint.getThreadFilters( getDebugTarget() );
|
||||||
|
if ( threads == null )
|
||||||
|
return new String[0];
|
||||||
|
String[] names = new String[threads.length];
|
||||||
|
for ( int i = 0; i < threads.length; ++i ) {
|
||||||
|
names[i] = threads[i].getName();
|
||||||
|
}
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
}
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
private ICDICondition createCondition( ICBreakpoint breakpoint ) throws CoreException, CDIException {
|
||||||
|
return getCDITarget().createCondition( breakpoint.getIgnoreCount(), breakpoint.getCondition(), getThreadNames( breakpoint ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -454,7 +454,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
catch( DebugException e1 ) {
|
catch( DebugException e1 ) {
|
||||||
CDebugUtils.error( e1.getStatus(), CDebugTarget.this );
|
failed( CoreModelMessages.getString( "CDebugTarget.2" ), e1 ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -514,7 +514,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
catch( DebugException e1 ) {
|
catch( DebugException e1 ) {
|
||||||
CDebugUtils.error( e1.getStatus(), CDebugTarget.this );
|
failed( CoreModelMessages.getString( "CDebugTarget.3" ), e1 ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -541,7 +541,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
catch( DebugException e1 ) {
|
catch( DebugException e1 ) {
|
||||||
CDebugUtils.error( e1.getStatus(), CDebugTarget.this );
|
failed( CoreModelMessages.getString( "CDebugTarget.4" ), e1 ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -690,13 +690,13 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
catch( DebugException e ) {
|
catch( DebugException e ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( delta != null ) {
|
// if ( delta != null ) {
|
||||||
try {
|
try {
|
||||||
getBreakpointManager().changeBreakpointProperties( b, delta );
|
getBreakpointManager().changeBreakpointProperties( b, delta );
|
||||||
}
|
}
|
||||||
catch( DebugException e ) {
|
catch( DebugException e ) {
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -748,7 +748,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
catch( DebugException e1 ) {
|
catch( DebugException e1 ) {
|
||||||
CDebugUtils.error( e1.getStatus(), CDebugTarget.this );
|
failed( CoreModelMessages.getString( "CDebugTarget.5" ), e1 ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -965,7 +965,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
catch( DebugException e1 ) {
|
catch( DebugException e1 ) {
|
||||||
CDebugUtils.error( e1.getStatus(), CDebugTarget.this );
|
failed( CoreModelMessages.getString( "CDebugTarget.6" ), e1 ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1554,7 +1554,7 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
targetRequestFailed( e.getMessage(), e );
|
targetRequestFailed( e.getMessage(), e );
|
||||||
}
|
}
|
||||||
catch( DebugException e1 ) {
|
catch( DebugException e1 ) {
|
||||||
CDebugUtils.error( e1.getStatus(), CDebugTarget.this );
|
failed( CoreModelMessages.getString( "CDebugTarget.7" ), e1 ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1871,4 +1871,10 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void failed( String message, Throwable e ) {
|
||||||
|
MultiStatus ms = new MultiStatus( CDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, message, null );
|
||||||
|
ms.add( new Status( IStatus.ERROR, CDebugModel.getPluginIdentifier(), ICDebugInternalConstants.STATUS_CODE_ERROR, e.getMessage(), e ) );
|
||||||
|
CDebugUtils.error( ms, this );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,12 @@ CArrayPartition.0=Type is not available.
|
||||||
CArrayPartition.1=Qualified name is not available.
|
CArrayPartition.1=Qualified name is not available.
|
||||||
CDebugTarget.0=Session does not support 'disconnect'.
|
CDebugTarget.0=Session does not support 'disconnect'.
|
||||||
CDebugTarget.1=Execution is suspended because of error.
|
CDebugTarget.1=Execution is suspended because of error.
|
||||||
|
CDebugTarget.2=Terminate failed.
|
||||||
|
CDebugTarget.3=Resume failed.
|
||||||
|
CDebugTarget.4=Suspend failed.
|
||||||
|
CDebugTarget.5=Disconnect failed.
|
||||||
|
CDebugTarget.6=Restart failed.
|
||||||
|
CDebugTarget.7=Resume without signal failed.
|
||||||
CModificationVariable.0=Unable to set value.
|
CModificationVariable.0=Unable to set value.
|
||||||
CModificationVariable.1=Unable to set value.
|
CModificationVariable.1=Unable to set value.
|
||||||
CStackFrame.0={0} at {1}: {2}
|
CStackFrame.0={0} at {1}: {2}
|
||||||
|
|
Loading…
Add table
Reference in a new issue