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