WineDbg patch

Eric Pouech eric.pouech at wanadoo.fr
Wed Aug 28 14:45:26 CDT 2002


as pointed out by Fabian Cenedese, implementation of BreakOnDllLoad in
winedbg was broken
this should fix it
(thanks to Fabi for spotting it)

A+
-------------- next part --------------
Name:          wd_bodl
ChangeLog:     fixed breaking DLL load
License:       X11
GenDate:       2002/08/28 19:43:25 UTC
ModifiedFiles: debugger/winedbg.c
AddedFiles:    
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/debugger/winedbg.c,v
retrieving revision 1.64
diff -u -u -r1.64 winedbg.c
--- debugger/winedbg.c	2 Aug 2002 19:00:53 -0000	1.64
+++ debugger/winedbg.c	28 Aug 2002 19:40:01 -0000
@@ -38,8 +38,9 @@
 DBG_THREAD*	DEBUG_CurrThread = NULL;
 DWORD		DEBUG_CurrTid;
 DWORD		DEBUG_CurrPid;
-CONTEXT		DEBUG_context;
+CONTEXT         DEBUG_context;
 BOOL		DEBUG_InteractiveP = FALSE;
+static BOOL     DEBUG_InException = FALSE;
 int 		curr_frame = 0;
 static char*	DEBUG_LastCmdLine = NULL;
 
@@ -333,11 +334,31 @@
     return TRUE;
 }
 
+static BOOL                     DEBUG_FetchContext(void)
+{
+    DEBUG_context.ContextFlags = CONTEXT_CONTROL
+                               | CONTEXT_INTEGER
+#ifdef CONTEXT_SEGMENTS
+                               | CONTEXT_SEGMENTS
+#endif
+#ifdef CONTEXT_DEBUG_REGISTERS
+	                       | CONTEXT_DEBUG_REGISTERS
+#endif
+                               ;
+    if (!GetThreadContext(DEBUG_CurrThread->handle, &DEBUG_context))
+    {
+        DEBUG_Printf(DBG_CHN_WARN, "Can't get thread's context\n");
+        return FALSE;
+    }
+    return TRUE;
+}
+
 static  BOOL	DEBUG_ExceptionProlog(BOOL is_debug, BOOL force, DWORD code)
 {
     DBG_ADDR	addr;
     int		newmode;
 
+    DEBUG_InException = TRUE;
     DEBUG_GetCurrentAddress(&addr);
     DEBUG_SuspendExecution();
 
@@ -429,6 +450,7 @@
      */
     if (DEBUG_CurrThread->exec_mode == EXEC_CONT)
 	DEBUG_CurrThread->exec_count = 0;
+    DEBUG_InException = FALSE;
 }
 
 static	BOOL DEBUG_HandleException(EXCEPTION_RECORD *rec, BOOL first_chance, BOOL force)
@@ -600,29 +622,16 @@
             if (!DBG_IVAR(BreakOnAttach)) break;
         }
 
-        DEBUG_context.ContextFlags =  CONTEXT_CONTROL
-                                    | CONTEXT_INTEGER
-#ifdef CONTEXT_SEGMENTS
-                                    | CONTEXT_SEGMENTS
-#endif
-#ifdef CONTEXT_DEBUG_REGISTERS
-	                            | CONTEXT_DEBUG_REGISTERS
-#endif
-                                    ;
-
-        if (!GetThreadContext(DEBUG_CurrThread->handle, &DEBUG_context))
+        if (DEBUG_FetchContext())
         {
-            DEBUG_Printf(DBG_CHN_WARN, "Can't get thread's context\n");
-            break;
-        }
-
-        ret = DEBUG_HandleException(&de->u.Exception.ExceptionRecord,
-                                    de->u.Exception.dwFirstChance,
-                                    DEBUG_CurrThread->wait_for_first_exception);
-        if (DEBUG_CurrThread)
-        {
-            DEBUG_CurrThread->wait_for_first_exception = 0;
-            SetThreadContext(DEBUG_CurrThread->handle, &DEBUG_context);
+            ret = DEBUG_HandleException(&de->u.Exception.ExceptionRecord,
+                                        de->u.Exception.dwFirstChance,
+                                        DEBUG_CurrThread->wait_for_first_exception);
+            if (!ret && DEBUG_CurrThread)
+            {
+                DEBUG_CurrThread->wait_for_first_exception = 0;
+                SetThreadContext(DEBUG_CurrThread->handle, &DEBUG_context);
+            }
         }
         break;
 
@@ -764,7 +773,7 @@
         {
             DEBUG_Printf(DBG_CHN_MESG, "Stopping on DLL %s loading at %08lx\n",
                          buffer, (unsigned long)de->u.LoadDll.lpBaseOfDll);
-            ret = TRUE;
+            ret = DEBUG_FetchContext();
         }
         break;
 
@@ -805,24 +814,27 @@
 
 static void                     DEBUG_ResumeDebuggee(DWORD cont)
 {
-    DEBUG_ExceptionEpilog();
+    if (DEBUG_InException)
+    {
+        DEBUG_ExceptionEpilog();
 #if 1
-    DEBUG_Printf(DBG_CHN_TRACE,
-                 "Exiting debugger      PC=%lx EFL=%08lx mode=%d count=%d\n",
+        DEBUG_Printf(DBG_CHN_TRACE,
+                     "Exiting debugger      PC=%lx EFL=%08lx mode=%d count=%d\n",
 #ifdef __i386__
-                 DEBUG_context.Eip, DEBUG_context.EFlags,
+                     DEBUG_context.Eip, DEBUG_context.EFlags,
 #else
-                 0L, 0L,
+                     0L, 0L,
 #endif
-                 DEBUG_CurrThread->exec_mode, DEBUG_CurrThread->exec_count);
+                     DEBUG_CurrThread->exec_mode, DEBUG_CurrThread->exec_count);
 #endif
-    DEBUG_InteractiveP = FALSE;
-    if (DEBUG_CurrThread)
-    {
-        if (!SetThreadContext(DEBUG_CurrThread->handle, &DEBUG_context))
-            DEBUG_Printf(DBG_CHN_MESG, "Cannot set ctx on %lu\n", DEBUG_CurrTid);
-        DEBUG_CurrThread->wait_for_first_exception = 0;
+        if (DEBUG_CurrThread)
+        {
+            if (!SetThreadContext(DEBUG_CurrThread->handle, &DEBUG_context))
+                DEBUG_Printf(DBG_CHN_MESG, "Cannot set ctx on %lu\n", DEBUG_CurrTid);
+            DEBUG_CurrThread->wait_for_first_exception = 0;
+        }
     }
+    DEBUG_InteractiveP = FALSE;
     if (!ContinueDebugEvent(DEBUG_CurrPid, DEBUG_CurrTid, cont))
         DEBUG_Printf(DBG_CHN_MESG, "Cannot continue on %lu (%lu)\n",
                      DEBUG_CurrTid, cont);


More information about the wine-patches mailing list