Rémi Bernon : ntdll: Print a warning or an error for other exceptions.
Alexandre Julliard
julliard at winehq.org
Mon Feb 8 15:46:41 CST 2021
Module: wine
Branch: master
Commit: da3be6b0b60b509c00d39b479b4cfb21c7cf9c4d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=da3be6b0b60b509c00d39b479b4cfb21c7cf9c4d
Author: Rémi Bernon <rbernon at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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]);
More information about the wine-cvs
mailing list