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

Bug 314628: Always restore the target state even if a failure has happened.

This commit is contained in:
Marc Khouzam 2010-05-28 18:48:01 +00:00
parent 54d5da166c
commit 69444100a5
4 changed files with 59 additions and 1 deletions

View file

@ -994,6 +994,11 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
rm.done();
}
}
@Override
public void rollBack(RequestMonitor rm) {
Sequence.Step restoreStep = new RestoreTargetStateStep();
restoreStep.execute(rm);
}
};
/**

View file

@ -28,7 +28,7 @@ public interface IMIRunControl extends IRunControl2
* to receive commands. Once the specified steps are executed, the target should be
* returned to its original availability.
*
* This can is of value for breakpoints commands; e.g., breakpoints need to be inserted
* This is of value for breakpoints commands; e.g., breakpoints need to be inserted
* even when the target is running, so this call would suspend the target, insert the
* breakpoint, and resume the target again.
*

View file

@ -1012,6 +1012,11 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
rm.done();
}
}
@Override
public void rollBack(RequestMonitor rm) {
Sequence.Step restoreStep = new RestoreTargetStateStep();
restoreStep.execute(rm);
}
};
/**

View file

@ -1238,6 +1238,54 @@ public class MIBreakpointsTest extends BaseTestCase {
((MIBreakpointHitEvent)event).getNumber() == ref.getReference());
}
// ------------------------------------------------------------------------
// insertInvalidBreakpoint_WhileTargetRunning
// Set an invalid breakpoint while the target is running, then set a valid
// breakpoint and make sure the second breakpoints eventually gets hit.
//
// We had a problem where an invalid breakpoint set when the target was running
// would leave us in a bad state (Bug 314628)
// ------------------------------------------------------------------------
@Test
public void insertInvalidBreakpoint_WhileTargetRunning() throws Throwable {
// Create a line breakpoint
Map<String, Object> breakpoint = new HashMap<String, Object>();
breakpoint.put(BREAKPOINT_TYPE_TAG, BREAKPOINT_TAG);
breakpoint.put(FILE_NAME_TAG, "Bad file name");
breakpoint.put(LINE_NUMBER_TAG, LINE_NUMBER_5);
// Run the program. It will make a two second sleep() call, during which time...
SyncUtil.resume();
// ...we install the bad breakpoint and check that it failed
insertBreakpoint(fBreakpointsDmc, breakpoint);
assertTrue(fWait.getMessage(), !fWait.isOK());
// Now install a proper breakpoint an see that it hits without having to resume
// the target. This will show that the target was still properly running.
breakpoint.put(FILE_NAME_TAG, SOURCE_FILE);
MIBreakpointDMContext ref = (MIBreakpointDMContext) insertBreakpoint(fBreakpointsDmc, breakpoint);
// Wait for breakpoint to hit.
MIStoppedEvent event = waitForBreakpointEventsAfterBreakpointOperationWhileTargetRunning(true, 2);
// Ensure the correct BreakpointEvent was received
MIBreakpointDMData breakpoint1 = (MIBreakpointDMData) getBreakpoint(ref);
assertTrue("BreakpointEvent problem: expected " + 2 + " BREAKPOINT event(s), received "
+ fBreakpointEventCount, fBreakpointEventCount == 2);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT_HIT event(s), received "
+ getBreakpointEventCount(BP_HIT), getBreakpointEventCount(BP_HIT) == 1);
assertTrue("BreakpointService problem: breakpoint mismatch",
fBreakpointRef == breakpoint1.getNumber());
clearEventCounters();
assertTrue("Did not stop because of breakpoint, but stopped because of: " +
event.getClass().getCanonicalName(), event instanceof MIBreakpointHitEvent);
assertTrue("Did not stop because of the correct breakpoint at line " + LINE_NUMBER_5,
((MIBreakpointHitEvent)event).getNumber() == ref.getReference());
}
///////////////////////////////////////////////////////////////////////////
// Add Watchpoint tests
///////////////////////////////////////////////////////////////////////////