winedbg: Clean handle_exception return values.
It was returning a mix of TRUE/FALSE and in some cases DBG_CONTINUE. Let's return TRUE if the exception has been handled and should be ignored, or FALSE if not and if we should notify gdb. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
729a2462fb
commit
2fcf051fae
|
@ -312,8 +312,7 @@ static void dbg_thread_set_single_step(struct dbg_thread *thread, BOOL enable)
|
||||||
|
|
||||||
static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* exc)
|
static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* exc)
|
||||||
{
|
{
|
||||||
EXCEPTION_RECORD* rec = &exc->ExceptionRecord;
|
EXCEPTION_RECORD* rec = &exc->ExceptionRecord;
|
||||||
BOOL ret = FALSE;
|
|
||||||
|
|
||||||
switch (rec->ExceptionCode)
|
switch (rec->ExceptionCode)
|
||||||
{
|
{
|
||||||
|
@ -322,18 +321,15 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
|
||||||
case EXCEPTION_STACK_OVERFLOW:
|
case EXCEPTION_STACK_OVERFLOW:
|
||||||
case EXCEPTION_GUARD_PAGE:
|
case EXCEPTION_GUARD_PAGE:
|
||||||
gdbctx->last_sig = SIGSEGV;
|
gdbctx->last_sig = SIGSEGV;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
||||||
gdbctx->last_sig = SIGBUS;
|
gdbctx->last_sig = SIGBUS;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case EXCEPTION_SINGLE_STEP:
|
case EXCEPTION_SINGLE_STEP:
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case EXCEPTION_BREAKPOINT:
|
case EXCEPTION_BREAKPOINT:
|
||||||
gdbctx->last_sig = SIGTRAP;
|
gdbctx->last_sig = SIGTRAP;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case EXCEPTION_FLT_DENORMAL_OPERAND:
|
case EXCEPTION_FLT_DENORMAL_OPERAND:
|
||||||
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
|
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
|
||||||
case EXCEPTION_FLT_INEXACT_RESULT:
|
case EXCEPTION_FLT_INEXACT_RESULT:
|
||||||
|
@ -342,26 +338,21 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
|
||||||
case EXCEPTION_FLT_STACK_CHECK:
|
case EXCEPTION_FLT_STACK_CHECK:
|
||||||
case EXCEPTION_FLT_UNDERFLOW:
|
case EXCEPTION_FLT_UNDERFLOW:
|
||||||
gdbctx->last_sig = SIGFPE;
|
gdbctx->last_sig = SIGFPE;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
||||||
case EXCEPTION_INT_OVERFLOW:
|
case EXCEPTION_INT_OVERFLOW:
|
||||||
gdbctx->last_sig = SIGFPE;
|
gdbctx->last_sig = SIGFPE;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
||||||
gdbctx->last_sig = SIGILL;
|
gdbctx->last_sig = SIGILL;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case CONTROL_C_EXIT:
|
case CONTROL_C_EXIT:
|
||||||
gdbctx->last_sig = SIGINT;
|
gdbctx->last_sig = SIGINT;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case STATUS_POSSIBLE_DEADLOCK:
|
case STATUS_POSSIBLE_DEADLOCK:
|
||||||
gdbctx->last_sig = SIGALRM;
|
|
||||||
ret = TRUE;
|
|
||||||
/* FIXME: we could also add here a O packet with additional information */
|
/* FIXME: we could also add here a O packet with additional information */
|
||||||
break;
|
gdbctx->last_sig = SIGALRM;
|
||||||
|
return FALSE;
|
||||||
case EXCEPTION_NAME_THREAD:
|
case EXCEPTION_NAME_THREAD:
|
||||||
{
|
{
|
||||||
const THREADNAME_INFO *threadname = (const THREADNAME_INFO *)rec->ExceptionInformation;
|
const THREADNAME_INFO *threadname = (const THREADNAME_INFO *)rec->ExceptionInformation;
|
||||||
|
@ -384,17 +375,15 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ERR("Cannot set name of thread %04x\n", threadname->dwThreadID);
|
ERR("Cannot set name of thread %04x\n", threadname->dwThreadID);
|
||||||
return DBG_CONTINUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
case EXCEPTION_INVALID_HANDLE:
|
case EXCEPTION_INVALID_HANDLE:
|
||||||
return DBG_CONTINUE;
|
return TRUE;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Unhandled exception code 0x%08x\n", rec->ExceptionCode);
|
fprintf(stderr, "Unhandled exception code 0x%08x\n", rec->ExceptionCode);
|
||||||
gdbctx->last_sig = SIGABRT;
|
gdbctx->last_sig = SIGABRT;
|
||||||
ret = TRUE;
|
return FALSE;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_debug_event(struct gdb_context* gdbctx)
|
static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
|
@ -469,7 +458,7 @@ static void handle_debug_event(struct gdb_context* gdbctx)
|
||||||
TRACE("%08x:%08x: exception code=0x%08x\n", de->dwProcessId,
|
TRACE("%08x:%08x: exception code=0x%08x\n", de->dwProcessId,
|
||||||
de->dwThreadId, de->u.Exception.ExceptionRecord.ExceptionCode);
|
de->dwThreadId, de->u.Exception.ExceptionRecord.ExceptionCode);
|
||||||
|
|
||||||
gdbctx->in_trap = handle_exception(gdbctx, &de->u.Exception);
|
gdbctx->in_trap = !handle_exception(gdbctx, &de->u.Exception);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CREATE_THREAD_DEBUG_EVENT:
|
case CREATE_THREAD_DEBUG_EVENT:
|
||||||
|
|
Loading…
Reference in New Issue