Module: wine Branch: master Commit: da3be6b0b60b509c00d39b479b4cfb21c7cf9c4d URL: https://source.winehq.org/git/wine.git/?a=commit;h=da3be6b0b60b509c00d39b479...
Author: Rémi Bernon rbernon@codeweavers.com Date: Fri Feb 5 10:21:30 2021 +0100
ntdll: Print a warning or an error for other exceptions.
Depending on EH_NONCONTINUABLE.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/exception.c | 38 ++++++++++++++++++++++++++++++++++++++ dlls/ntdll/ntdll_misc.h | 1 + dlls/ntdll/signal_arm.c | 5 +++++ dlls/ntdll/signal_arm64.c | 5 +++++ dlls/ntdll/signal_i386.c | 5 +++++ dlls/ntdll/signal_x86_64.c | 5 +++++ include/wine/exception.h | 9 +++++++++ programs/winedbg/debugger.h | 9 --------- programs/winedbg/info.c | 6 +++--- 9 files changed, 71 insertions(+), 12 deletions(-)
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 6b51be39be0..4594d12f8a0 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -61,6 +61,44 @@ static RTL_CRITICAL_SECTION vectored_handlers_section = { &critsect_debug, -1, 0
static PRTL_EXCEPTION_FILTER unhandled_exception_filter;
+const char *debugstr_exception_code( DWORD code ) +{ + switch (code) + { + case CONTROL_C_EXIT: return "CONTROL_C_EXIT"; + case DBG_CONTROL_C: return "DBG_CONTROL_C"; + case DBG_PRINTEXCEPTION_C: return "DBG_PRINTEXCEPTION_C"; + case DBG_PRINTEXCEPTION_WIDE_C: return "DBG_PRINTEXCEPTION_WIDE_C"; + case EXCEPTION_ACCESS_VIOLATION: return "EXCEPTION_ACCESS_VIOLATION"; + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED"; + case EXCEPTION_BREAKPOINT: return "EXCEPTION_BREAKPOINT"; + case EXCEPTION_DATATYPE_MISALIGNMENT: return "EXCEPTION_DATATYPE_MISALIGNMENT"; + case EXCEPTION_FLT_DENORMAL_OPERAND: return "EXCEPTION_FLT_DENORMAL_OPERAND"; + case EXCEPTION_FLT_DIVIDE_BY_ZERO: return "EXCEPTION_FLT_DIVIDE_BY_ZERO"; + case EXCEPTION_FLT_INEXACT_RESULT: return "EXCEPTION_FLT_INEXACT_RESULT"; + case EXCEPTION_FLT_INVALID_OPERATION: return "EXCEPTION_FLT_INVALID_OPERATION"; + case EXCEPTION_FLT_OVERFLOW: return "EXCEPTION_FLT_OVERFLOW"; + case EXCEPTION_FLT_STACK_CHECK: return "EXCEPTION_FLT_STACK_CHECK"; + case EXCEPTION_FLT_UNDERFLOW: return "EXCEPTION_FLT_UNDERFLOW"; + case EXCEPTION_GUARD_PAGE: return "EXCEPTION_GUARD_PAGE"; + case EXCEPTION_ILLEGAL_INSTRUCTION: return "EXCEPTION_ILLEGAL_INSTRUCTION"; + case EXCEPTION_IN_PAGE_ERROR: return "EXCEPTION_IN_PAGE_ERROR"; + case EXCEPTION_INT_DIVIDE_BY_ZERO: return "EXCEPTION_INT_DIVIDE_BY_ZERO"; + case EXCEPTION_INT_OVERFLOW: return "EXCEPTION_INT_OVERFLOW"; + case EXCEPTION_INVALID_DISPOSITION: return "EXCEPTION_INVALID_DISPOSITION"; + case EXCEPTION_INVALID_HANDLE: return "EXCEPTION_INVALID_HANDLE"; + case EXCEPTION_NONCONTINUABLE_EXCEPTION: return "EXCEPTION_NONCONTINUABLE_EXCEPTION"; + case EXCEPTION_PRIV_INSTRUCTION: return "EXCEPTION_PRIV_INSTRUCTION"; + case EXCEPTION_SINGLE_STEP: return "EXCEPTION_SINGLE_STEP"; + case EXCEPTION_STACK_OVERFLOW: return "EXCEPTION_STACK_OVERFLOW"; + case EXCEPTION_WINE_ASSERTION: return "EXCEPTION_WINE_ASSERTION"; + case EXCEPTION_WINE_CXX_EXCEPTION: return "EXCEPTION_WINE_CXX_EXCEPTION"; + case EXCEPTION_WINE_NAME_THREAD: return "EXCEPTION_WINE_NAME_THREAD"; + case EXCEPTION_WINE_STUB: return "EXCEPTION_WINE_STUB"; + } + return "unknown"; +} +
static VECTORED_HANDLER *add_vectored_handler( struct list *handler_list, ULONG first, PVECTORED_EXCEPTION_HANDLER func ) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 41e8666a25c..60b8ffc46d6 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -55,6 +55,7 @@ extern RUNTIME_FUNCTION *lookup_function_info( ULONG_PTR pc, ULONG_PTR *base, LD
/* debug helpers */ extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN; +extern const char *debugstr_exception_code( DWORD code ) DECLSPEC_HIDDEN;
/* init routines */ extern void version_init(void) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 1b98dd5cc70..7c1fceb2bf0 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -174,6 +174,11 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte } else { + if (rec->ExceptionFlags & EH_NONCONTINUABLE) + ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + else + WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + TRACE( " r0=%08x r1=%08x r2=%08x r3=%08x r4=%08x r5=%08x\n", context->R0, context->R1, context->R2, context->R3, context->R4, context->R5 ); TRACE( " r6=%08x r7=%08x r8=%08x r9=%08x r10=%08x r11=%08x\n", diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 078fa947c42..e198f4e607e 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -515,6 +515,11 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte } else { + if (rec->ExceptionFlags & EH_NONCONTINUABLE) + ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + else + WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + TRACE(" x0=%016lx x1=%016lx x2=%016lx x3=%016lx\n", context->u.s.X0, context->u.s.X1, context->u.s.X2, context->u.s.X3 ); TRACE(" x4=%016lx x5=%016lx x6=%016lx x7=%016lx\n", diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 6ec696931e9..89ef938658c 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -206,6 +206,11 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) } else { + if (rec->ExceptionFlags & EH_NONCONTINUABLE) + ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + else + WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + TRACE(" eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\n", context->Eax, context->Ebx, context->Ecx, context->Edx, context->Esi, context->Edi ); diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index df133d6fce9..7e90b109ad0 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -552,6 +552,11 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) } else { + if (rec->ExceptionFlags & EH_NONCONTINUABLE) + ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + else + WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + TRACE(" rax=%016lx rbx=%016lx rcx=%016lx rdx=%016lx\n", context->Rax, context->Rbx, context->Rcx, context->Rdx ); TRACE(" rsi=%016lx rdi=%016lx rbp=%016lx rsp=%016lx\n", diff --git a/include/wine/exception.h b/include/wine/exception.h index 3d28ff6b110..94796a78e4f 100644 --- a/include/wine/exception.h +++ b/include/wine/exception.h @@ -308,6 +308,15 @@ static inline EXCEPTION_REGISTRATION_RECORD *__wine_get_frame(void) for more info. */ #define EXCEPTION_WINE_NAME_THREAD 0x406D1388
+/* used for C++ exceptions in msvcrt + * parameters: + * [0] CXX_FRAME_MAGIC + * [1] pointer to exception object + * [2] pointer to type + */ +#define EXCEPTION_WINE_CXX_EXCEPTION 0xe06d7363 +#define EXCEPTION_WINE_CXX_FRAME_MAGIC 0x19930520 + #ifdef __cplusplus } #endif diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h index 05bf0c047ba..3bcf9d37f23 100644 --- a/programs/winedbg/debugger.h +++ b/programs/winedbg/debugger.h @@ -146,15 +146,6 @@ struct dbg_breakpoint struct expr* condition; };
-/* used for C++ exceptions in msvcrt - * parameters: - * [0] CXX_FRAME_MAGIC - * [1] pointer to exception object - * [2] pointer to type - */ -#define CXX_EXCEPTION 0xe06d7363 -#define CXX_FRAME_MAGIC 0x19930520 - /* Helper structure */ typedef struct tagTHREADNAME_INFO { diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c index 4e8580db0d4..e1f3d269649 100644 --- a/programs/winedbg/info.c +++ b/programs/winedbg/info.c @@ -951,11 +951,11 @@ void info_win32_exception(void) case EXCEPTION_FLT_STACK_CHECK: dbg_printf("floating point stack check"); break; - case CXX_EXCEPTION: - if(rec->NumberParameters == 3 && rec->ExceptionInformation[0] == CXX_FRAME_MAGIC) + case EXCEPTION_WINE_CXX_EXCEPTION: + if(rec->NumberParameters == 3 && rec->ExceptionInformation[0] == EXCEPTION_WINE_CXX_FRAME_MAGIC) dbg_printf("C++ exception(object = 0x%08lx, type = 0x%08lx)", rec->ExceptionInformation[1], rec->ExceptionInformation[2]); - else if(rec->NumberParameters == 4 && rec->ExceptionInformation[0] == CXX_FRAME_MAGIC) + else if(rec->NumberParameters == 4 && rec->ExceptionInformation[0] == EXCEPTION_WINE_CXX_FRAME_MAGIC) dbg_printf("C++ exception(object = %p, type = %p, base = %p)", (void*)rec->ExceptionInformation[1], (void*)rec->ExceptionInformation[2], (void*)rec->ExceptionInformation[3]);