Rémi Bernon : ntdll: Print a warning for thread rename exceptions.

Alexandre Julliard julliard at winehq.org
Mon Feb 8 15:46:40 CST 2021


Module: wine
Branch: master
Commit: 6edf3d3b09efe8b8350bddf068b895dd8fbf07c5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6edf3d3b09efe8b8350bddf068b895dd8fbf07c5

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Feb  5 10:21:28 2021 +0100

ntdll: Print a warning for thread rename exceptions.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/signal_arm.c       | 4 ++++
 dlls/ntdll/signal_arm64.c     | 4 ++++
 dlls/ntdll/signal_i386.c      | 4 ++++
 dlls/ntdll/signal_x86_64.c    | 4 ++++
 include/wine/exception.h      | 6 ++++++
 programs/winedbg/debugger.h   | 6 ------
 programs/winedbg/gdbproxy.c   | 5 +++--
 programs/winedbg/tgt_active.c | 2 +-
 8 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index b1544ba15fe..f4da2e5c71d 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -160,6 +160,10 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte
                      rec->ExceptionAddress,
                      (char*)rec->ExceptionInformation[0], rec->ExceptionInformation[1] );
     }
+    else if (rec->ExceptionCode == EXCEPTION_WINE_NAME_THREAD && rec->ExceptionInformation[0] == 0x1000)
+    {
+        WARN( "Thread %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) );
+    }
     else
     {
         TRACE( " r0=%08x r1=%08x r2=%08x r3=%08x r4=%08x r5=%08x\n",
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 9db8a8b17b4..88e31d88f7b 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -501,6 +501,10 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte
                      rec->ExceptionAddress,
                      (char*)rec->ExceptionInformation[0], rec->ExceptionInformation[1] );
     }
+    else if (rec->ExceptionCode == EXCEPTION_WINE_NAME_THREAD && rec->ExceptionInformation[0] == 0x1000)
+    {
+        WARN( "Thread %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) );
+    }
     else
     {
         TRACE("  x0=%016lx  x1=%016lx  x2=%016lx  x3=%016lx\n",
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 93e03ae5b8b..a570be10024 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -192,6 +192,10 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context )
                      rec->ExceptionAddress,
                      (char*)rec->ExceptionInformation[0], rec->ExceptionInformation[1] );
     }
+    else if (rec->ExceptionCode == EXCEPTION_WINE_NAME_THREAD && rec->ExceptionInformation[0] == 0x1000)
+    {
+        WARN( "Thread %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) );
+    }
     else
     {
         TRACE(" eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\n",
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 7e39991ad1a..7a3fd4be204 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -538,6 +538,10 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context )
                      rec->ExceptionAddress,
                      (char*)rec->ExceptionInformation[0], rec->ExceptionInformation[1] );
     }
+    else if (rec->ExceptionCode == EXCEPTION_WINE_NAME_THREAD && rec->ExceptionInformation[0] == 0x1000)
+    {
+        WARN( "Thread %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) );
+    }
     else
     {
         TRACE(" rax=%016lx rbx=%016lx rcx=%016lx rdx=%016lx\n",
diff --git a/include/wine/exception.h b/include/wine/exception.h
index a2b0bb08dc3..3d28ff6b110 100644
--- a/include/wine/exception.h
+++ b/include/wine/exception.h
@@ -302,6 +302,12 @@ static inline EXCEPTION_REGISTRATION_RECORD *__wine_get_frame(void)
 #define EXCEPTION_WINE_STUB       0x80000100  /* stub entry point called */
 #define EXCEPTION_WINE_ASSERTION  0x80000101  /* assertion failed */
 
+/* Wine extension; Windows doesn't have a name for this code.  This is an
+   undocumented exception understood by MS VC debugger, allowing the program
+   to name a particular thread.  Search google.com or deja.com for "0x406d1388"
+   for more info. */
+#define EXCEPTION_WINE_NAME_THREAD     0x406D1388
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index ddac129bab5..05bf0c047ba 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -155,12 +155,6 @@ struct dbg_breakpoint
 #define CXX_EXCEPTION                       0xe06d7363
 #define CXX_FRAME_MAGIC                     0x19930520
 
-/* Wine extension; Windows doesn't have a name for this code.  This is an
-   undocumented exception understood by MS VC debugger, allowing the program
-   to name a particular thread.  Search google.com or deja.com for "0x406d1388"
-   for more info. */
-#define EXCEPTION_NAME_THREAD               0x406D1388
-
 /* Helper structure */
 typedef struct tagTHREADNAME_INFO
 {
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index c51fd342496..3c1b3e85df8 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -63,6 +63,7 @@
 #include "windef.h"
 #include "winbase.h"
 #include "tlhelp32.h"
+#include "wine/exception.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
@@ -349,7 +350,7 @@ static unsigned char signal_from_debug_event(DEBUG_EVENT* de)
         return SIGALRM;
     /* should not be here */
     case EXCEPTION_INVALID_HANDLE:
-    case EXCEPTION_NAME_THREAD:
+    case EXCEPTION_WINE_NAME_THREAD:
         return SIGTRAP;
     default:
         ERR("Unknown exception code 0x%08x\n", ec);
@@ -363,7 +364,7 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
 
     switch (rec->ExceptionCode)
     {
-    case EXCEPTION_NAME_THREAD:
+    case EXCEPTION_WINE_NAME_THREAD:
     {
         const THREADNAME_INFO *threadname = (const THREADNAME_INFO *)rec->ExceptionInformation;
         struct dbg_thread *thread;
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index d4e2d7d6347..e71f4615735 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -246,7 +246,7 @@ static DWORD dbg_handle_exception(const EXCEPTION_RECORD* rec, BOOL first_chance
     case EXCEPTION_SINGLE_STEP:
         is_debug = TRUE;
         break;
-    case EXCEPTION_NAME_THREAD:
+    case EXCEPTION_WINE_NAME_THREAD:
         pThreadName = (const THREADNAME_INFO*)(rec->ExceptionInformation);
         if (pThreadName->dwThreadID == -1)
             pThread = dbg_curr_thread;




More information about the wine-cvs mailing list