[PATCH 08/12] [WineDbg]: added a close_process method to process_io

Eric Pouech eric.pouech at wanadoo.fr
Fri Feb 24 15:16:42 CST 2006


- added a close_process method to process_io
- made use of it to get rid of dbg_detach

This is necessary for next patch where depending on the target
model winedbg's using, we need to have different ways of 
destroying a process

A+
---

 programs/winedbg/dbg.y        |    2 +
 programs/winedbg/debugger.h   |    2 +
 programs/winedbg/stack.c      |    4 +-
 programs/winedbg/tgt_active.c |   67 +++++++++++++++++++++--------------------
 programs/winedbg/winedbg.c    |    3 ++
 5 files changed, 41 insertions(+), 37 deletions(-)

diff --git a/programs/winedbg/dbg.y b/programs/winedbg/dbg.y
index 890af74..bef066d 100644
--- a/programs/winedbg/dbg.y
+++ b/programs/winedbg/dbg.y
@@ -139,7 +139,7 @@ command:
     | tSYMBOLFILE pathname expr_rvalue { symbol_read_symtable($2, $3); }
     | tWHATIS expr_lvalue       { dbg_printf("type = "); types_print_type(&$2.type, FALSE); dbg_printf("\n"); }
     | tATTACH tNUM     		{ dbg_attach_debuggee($2, FALSE, TRUE); }
-    | tDETACH                   { dbg_detach_debuggee(); }
+    | tDETACH                   { dbg_curr_process->process_io->close_process(dbg_curr_process, FALSE); }
     | tMINIDUMP pathname        { minidump_write($2, (dbg_curr_thread && dbg_curr_thread->in_exception) ? &dbg_curr_thread->excpt_record : NULL);}
     | tECHO tSTRING             { dbg_printf("%s\n", $2); }
     | run_command
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index ecfe2f4..73e53a2 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -216,6 +216,7 @@ struct dbg_process
 /* describes the way the debugger interacts with a given process */
 struct be_process_io
 {
+    BOOL        (*close_process)(struct dbg_process*, BOOL);
     BOOL        (WINAPI *read)(HANDLE, const void*, void*, DWORD, DWORD*);
     BOOL        (WINAPI *write)(HANDLE, void*, const void*, DWORD, DWORD*);
 };
@@ -403,7 +404,6 @@ extern int	        dbg_printf(const char
 #endif
 extern const struct dbg_internal_var* dbg_get_internal_var(const char*);
 extern BOOL             dbg_attach_debuggee(DWORD pid, BOOL cofe, BOOL wfe);
-extern BOOL             dbg_detach_debuggee(void);
 extern BOOL             dbg_interrupt_debuggee(void);
 extern struct dbg_process* dbg_add_process(DWORD pid, HANDLE h);
 extern void             dbg_set_process_name(struct dbg_process* p, const char* name);
diff --git a/programs/winedbg/stack.c b/programs/winedbg/stack.c
index 675427b..bc996c0 100644
--- a/programs/winedbg/stack.c
+++ b/programs/winedbg/stack.c
@@ -338,7 +338,7 @@ static void backtrace_all(void)
         {
             if (entry.th32OwnerProcessID == GetCurrentProcessId()) continue;
             if (dbg_curr_process && dbg_curr_pid != entry.th32OwnerProcessID)
-                dbg_detach_debuggee();
+                dbg_curr_process->process_io->close_process(dbg_curr_process, FALSE);
 
             if (entry.th32OwnerProcessID != dbg_curr_pid)
             {
@@ -358,7 +358,7 @@ static void backtrace_all(void)
         while (Thread32Next(snapshot, &entry));
 
         if (dbg_curr_process)
-            dbg_detach_debuggee();
+            dbg_curr_process->process_io->close_process(dbg_curr_process, FALSE);
     }
     CloseHandle(snapshot);
 }
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index a035553..6758f9b 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -34,12 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
 
 static char*            dbg_last_cmd_line;
 
-struct be_process_io be_process_active_io =
-{
-    ReadProcessMemory,
-    WriteProcessMemory,
-};
-
 static void dbg_init_current_process(void)
 {
 }
@@ -100,23 +94,6 @@ BOOL dbg_attach_debuggee(DWORD pid, BOOL
     return TRUE;
 }
 
-BOOL dbg_detach_debuggee(void)
-{
-    /* remove all set breakpoints in debuggee code */
-    break_set_xpoints(FALSE);
-    /* needed for single stepping (ugly).
-     * should this be handled inside the server ??? 
-     */
-    be_cpu->single_step(&dbg_context, FALSE);
-    SetThreadContext(dbg_curr_thread->handle, &dbg_context);
-    if (dbg_curr_thread->in_exception)
-        ContinueDebugEvent(dbg_curr_pid, dbg_curr_tid, DBG_CONTINUE);
-    if (!DebugActiveProcessStop(dbg_curr_pid)) return FALSE;
-    dbg_del_process(dbg_curr_process);
-
-    return TRUE;
-}
-
 static unsigned dbg_fetch_context(void)
 {
     dbg_context.ContextFlags = CONTEXT_CONTROL
@@ -413,6 +390,8 @@ static DWORD dbg_handle_exception(const 
     return DBG_CONTINUE;
 }
 
+static BOOL tgt_process_active_close_process(struct dbg_process* pcs, BOOL kill);
+
 static unsigned dbg_handle_debug_event(DEBUG_EVENT* de)
 {
     char	buffer[256];
@@ -507,15 +486,7 @@ static unsigned dbg_handle_debug_event(D
             WINE_ERR("Unknown process\n");
             break;
         }
-        if (!SymCleanup(dbg_curr_process->handle))
-            dbg_printf("Couldn't initiate DbgHelp\n");
-        /* just in case */
-        break_set_xpoints(FALSE);
-        /* kill last thread */
-        dbg_del_thread(dbg_curr_process->threads);
-        dbg_del_process(dbg_curr_process);
-
-        dbg_printf("Process of pid=0x%08lx has terminated\n", dbg_curr_pid);
+        tgt_process_active_close_process(dbg_curr_process, FALSE);
         break;
 
     case CREATE_THREAD_DEBUG_EVENT:
@@ -687,7 +658,6 @@ void dbg_wait_next_exception(DWORD cont,
     }
     dbg_interactiveP = TRUE;
     parser_handle(hFile);
-    dbg_printf("WineDbg terminated on pid 0x%lx\n", dbg_curr_pid);
 
     return 0;
 }
@@ -927,3 +897,34 @@ enum dbg_start dbg_active_auto(int argc,
     dbg_main_loop(hFile);
     return TRUE;
 }
+
+static BOOL tgt_process_active_close_process(struct dbg_process* pcs, BOOL kill)
+{
+    if (pcs == dbg_curr_process)
+    {
+        /* remove all set breakpoints in debuggee code */
+        break_set_xpoints(FALSE);
+        /* needed for single stepping (ugly).
+         * should this be handled inside the server ??? 
+         */
+        be_cpu->single_step(&dbg_context, FALSE);
+        if (dbg_curr_thread->in_exception)
+        {
+            SetThreadContext(dbg_curr_thread->handle, &dbg_context);
+            ContinueDebugEvent(dbg_curr_pid, dbg_curr_tid, DBG_CONTINUE);
+        }
+        if (!kill && !DebugActiveProcessStop(dbg_curr_pid)) return FALSE;
+    }
+    SymCleanup(pcs->handle);
+    dbg_printf("Process of pid=0x%08lx has terminated\n", pcs->pid);
+    dbg_del_process(pcs);
+
+    return TRUE;
+}
+
+struct be_process_io be_process_active_io =
+{
+    tgt_process_active_close_process,
+    ReadProcessMemory,
+    WriteProcessMemory,
+};
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index 7cd7695..cd40734 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -551,6 +551,9 @@ int main(int argc, char** argv)
     }
 
     retv = dbg_main_loop(hFile);
+    while (dbg_process_list)
+        dbg_process_list->process_io->close_process(dbg_process_list, TRUE);
+
     dbg_save_internal_vars();
 
     return retv;





More information about the wine-patches mailing list