Akihiro Sagawa : ntdll: Add exception handling around DbgBreakPoint.

Alexandre Julliard julliard at winehq.org
Thu Oct 3 16:44:01 CDT 2019


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

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Mon Sep 30 22:08:00 2019 +0900

ntdll: Add exception handling around DbgBreakPoint.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47509
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/debugger.c | 31 +++++++++++++++++++++++--------
 dlls/ntdll/process.c           | 14 +++++++++++++-
 2 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/tests/debugger.c b/dlls/kernel32/tests/debugger.c
index 8148c396d0..4a1b1d4076 100644
--- a/dlls/kernel32/tests/debugger.c
+++ b/dlls/kernel32/tests/debugger.c
@@ -399,7 +399,7 @@ static void wait_for_breakpoint_(unsigned line, struct debugger_context *ctx)
        ctx->ev.u.Exception.ExceptionRecord.ExceptionCode);
 }
 
-static void process_attach_events(struct debugger_context *ctx)
+static void process_attach_events(struct debugger_context *ctx, BOOL pass_exception)
 {
     DEBUG_EVENT ev;
     BOOL ret;
@@ -445,6 +445,13 @@ static void process_attach_events(struct debugger_context *ctx)
        ctx->ev.u.Exception.ExceptionRecord.ExceptionCode);
     ok(ctx->ev.u.Exception.ExceptionRecord.ExceptionAddress == pDbgBreakPoint, "ExceptionAddress != DbgBreakPoint\n");
 
+    if (pass_exception)
+    {
+        ret = ContinueDebugEvent(ctx->ev.dwProcessId, ctx->ev.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
+        ok(ret, "ContinueDebugEvent failed, last error %d.\n", GetLastError());
+        ctx->ev.dwDebugEventCode = -1;
+    }
+
     /* flush debug events */
     do next_event(ctx, POLL_EVENT_TIMEOUT);
     while (ctx->ev.dwDebugEventCode == LOAD_DLL_DEBUG_EVENT || ctx->ev.dwDebugEventCode == UNLOAD_DLL_DEBUG_EVENT
@@ -477,7 +484,7 @@ static void doDebugger(int argc, char** argv)
     if (strstr(myARGV[2], "process"))
     {
         strcat(buf, "processing debug messages\n");
-        process_attach_events(&ctx);
+        process_attach_events(&ctx, FALSE);
     }
 
     debug_event=(argc >= 6 ? (HANDLE)(INT_PTR)atol(argv[5]) : NULL);
@@ -1023,7 +1030,7 @@ static void doChildren(int argc, char **argv)
     HeapFree(GetProcessHeap(), 0, cmd);
 }
 
-static void test_debug_children(char *name, DWORD flag, BOOL debug_child)
+static void test_debug_children(const char *name, DWORD flag, BOOL debug_child, BOOL pass_exception)
 {
     const char *arguments = "debugger children";
     struct child_blackbox blackbox;
@@ -1096,7 +1103,7 @@ static void test_debug_children(char *name, DWORD flag, BOOL debug_child)
     {
         DWORD last_thread;
 
-        process_attach_events(&ctx);
+        process_attach_events(&ctx, pass_exception);
         ok(ctx.pid == pi.dwProcessId, "unexpected dwProcessId %x\n", ctx.pid);
 
         ret = DebugBreakProcess(pi.hProcess);
@@ -1118,6 +1125,13 @@ static void test_debug_children(char *name, DWORD flag, BOOL debug_child)
 
         ret = SetEvent(event_attach);
         ok(ret, "SetEvent failed, last error %d.\n", GetLastError());
+
+        if (pass_exception)
+        {
+            ret = ContinueDebugEvent(ctx.ev.dwProcessId, ctx.ev.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
+            ok(ret, "ContinueDebugEvent failed, last error %d.\n", GetLastError());
+            ctx.ev.dwDebugEventCode = -1;
+        }
     }
 
     do next_event(&ctx, WAIT_EVENT_TIMEOUT);
@@ -1487,10 +1501,11 @@ START_TEST(debugger)
         test_ExitCode();
         test_RemoteDebugger();
         test_debug_loop(myARGC, myARGV);
-        test_debug_children(myARGV[0], DEBUG_PROCESS, TRUE);
-        test_debug_children(myARGV[0], DEBUG_ONLY_THIS_PROCESS, FALSE);
-        test_debug_children(myARGV[0], DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS, FALSE);
-        test_debug_children(myARGV[0], 0, FALSE);
+        test_debug_children(myARGV[0], DEBUG_PROCESS, TRUE, FALSE);
+        test_debug_children(myARGV[0], DEBUG_ONLY_THIS_PROCESS, FALSE, FALSE);
+        test_debug_children(myARGV[0], DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS, FALSE, FALSE);
+        test_debug_children(myARGV[0], 0, FALSE, FALSE);
+        test_debug_children(myARGV[0], 0, FALSE, TRUE);
         test_debugger(myARGV[0]);
     }
 }
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index e3c2ba5ccb..02ae4404fd 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -46,6 +46,7 @@
 #include "windef.h"
 #include "winternl.h"
 #include "ntdll_misc.h"
+#include "wine/exception.h"
 #include "wine/library.h"
 #include "wine/server.h"
 #include "wine/unicode.h"
@@ -1372,7 +1373,18 @@ done:
 void WINAPI DbgUiRemoteBreakin( void *arg )
 {
     TRACE( "\n" );
-    if (NtCurrentTeb()->Peb->BeingDebugged) DbgBreakPoint();
+    if (NtCurrentTeb()->Peb->BeingDebugged)
+    {
+        __TRY
+        {
+            DbgBreakPoint();
+        }
+        __EXCEPT_ALL
+        {
+            /* do nothing */
+        }
+        __ENDTRY
+    }
     RtlExitUserThread( STATUS_SUCCESS );
 }
 




More information about the wine-cvs mailing list