diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index fbea3e4e4667439b56bde72bf418c551b0947058..199d845c1dd55dfdc3eead61cb2c51723bb4875d 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -765,8 +765,19 @@ static void do_trap( CONTEXT *context, int trap_code ) switch(trap_code) { case T_TRCTRAP: /* Single-step exception */ - rec.ExceptionCode = EXCEPTION_SINGLE_STEP; - context->EFlags &= ~0x100; /* clear single-step flag */ + if (context->EFlags & 0x100) + { + rec.ExceptionCode = EXCEPTION_SINGLE_STEP; + context->EFlags &= ~0x100; /* clear single-step flag */ + } + else + { + /* likely we get this because of a kill(SIGTRAP) on ourself, + * so send a bp exception instead of a single step exception + */ + TRACE("Spurious single step trap => breakpoint simulation\n"); + rec.ExceptionCode = EXCEPTION_BREAKPOINT; + } break; case T_BPTFLT: /* Breakpoint exception */ rec.ExceptionAddress = (char *)rec.ExceptionAddress - 1; /* back up over the int3 instruction */