Description
One-time breakpoints stick around if Step Out breaks on another breakpoint before the one-time breakpoint is reached. This also applies to Step Over if we are stepping over a call, and the code for the call has a breakpoint somewhere inside.
Reason
The Step Out feature scans ahead for the next block terminator (ret/jmp/jcc/hlt) and sets an internal, one-time breakpoint on it. If another breakpoint (say a user breakpoint) is encountered before this block terminator is reached, the internal + one-time breakpoint is not removed when we trap on this other breakpoint.
Possible fix
If IDebugEventHandlers carried an internal "temp_breakpoint", that breakpoint can be set to be removed on every trap.