The test in TestTaskObserverInstructionAndCode adds an Instruction and Code observer, steps, deletes both and adds a new Code observer. This crashes the tracee as soon as it is resumed.
Try tracing the program counter each time the program is resumed and confirm that it is pointing at the correct instruction. On the i386, for a breakpoint, the instruction pointer is +1 the required value, for complex combinations of PT_STEP and hitting a breakpoint, that gets complex.
single-stepping a breakpoint advances the pc; presumably though it should be treated as though the breakpoint was hit with a continue - the pc needs to be decremented.
2007-01-15 Mark Wielaard <mark@klomp.org> Fixes bug #3676 * Breakpoint.java (stepDone): Only set if still installed. (isInstalled): new method. (toString): Prettify. * IsaIA32.java (isTaskStepped): Reset flag. * IsaX8664.java (isTaskStepped): Likewise. * LinuxIa32On64.java (LinuxIa32On64): Install IndirectRegisters for d0 till d7. * LinuxPtraceTaskState.java (Running.sendContinue): Rewritten to take breakpoints into account. (Running.handleStoppedEvent): Fix log message. Call sendContinue() on new state. (Running.handleTrappedEvent): Rewritten. (running, syscallRunning, inSyscallRunning, inSyscallRunningTraced): Now have type Running. (BlockedSignal.handleUnblock): Call sendContinue() on new state. * TestTaskObserverInstruction.java: Don't test Isa.isTaskStepped(). * TestTaskObserverInstructionAndCode.java: Enable.