[PATCH 03/12] [WineDbg]: active and command line

Eric Pouech eric.pouech at wanadoo.fr
Fri Feb 24 15:14:05 CST 2006


- move process attachment and process creation (related to command line
  handling) from winedbg.c to tgt_active.c
- tidy up argument parsing

A+
---

 programs/winedbg/debugger.h   |    6 +-
 programs/winedbg/tgt_active.c |   95 ++++++++++++++++++++++++++++++++-
 programs/winedbg/winedbg.c    |  119 ++++++++++-------------------------------
 3 files changed, 126 insertions(+), 94 deletions(-)

diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 97ad754..fbe8ea2 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -257,6 +257,8 @@ struct type_expr_t
     } u;
 };
 
+enum dbg_start {start_ok, start_error_parse, start_error_init};
+
   /* break.c */
 extern void             break_set_xpoints(BOOL set);
 extern BOOL             break_add_break(const ADDRESS* addr, BOOL verbose, BOOL swbp);
@@ -368,11 +370,11 @@ extern BOOL             symbol_is_local(
   /* tgt_active.c */
 extern void             dbg_run_debuggee(const char* args);
 extern void             dbg_wait_next_exception(DWORD cont, int count, int mode);
+extern enum dbg_start   dbg_active_attach(int argc, char* argv[]);
+extern enum dbg_start   dbg_active_launch(int argc, char* argv[]);
   /* temporary for tgt_active.c */
 extern enum dbg_action_mode {none_mode = 0, winedbg_mode, automatic_mode, gdb_mode} dbg_action_mode;
-extern char* dbg_last_cmd_line;
 extern unsigned         dbg_main_loop(HANDLE);
-extern unsigned         dbg_start_debuggee(LPSTR cmdLine);
 
   /* tgt_minidump.c */
 extern void             minidump_write(const char*, const EXCEPTION_RECORD*);
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index 5c7dfbe..335ae5c 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -32,7 +32,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
 
-/*static*/ char*	        dbg_last_cmd_line = NULL;
+static char*            dbg_last_cmd_line;
 /*static*/ enum dbg_action_mode dbg_action_mode;
 
 struct be_process_io be_process_active_io =
@@ -711,7 +711,7 @@ void dbg_wait_next_exception(DWORD cont,
     return 0;
 }
 
-/*static*/	unsigned dbg_start_debuggee(LPSTR cmdLine)
+static	unsigned dbg_start_debuggee(LPSTR cmdLine)
 {
     PROCESS_INFORMATION	info;
     STARTUPINFOA	startup;
@@ -781,3 +781,94 @@ void	dbg_run_debuggee(const char* args)
     }
 }
 
+static BOOL     str2int(const char* str, DWORD* val)
+{
+    char*   ptr;
+
+    *val = strtol(str, &ptr, 10);
+    return str < ptr && !*ptr;
+}
+
+
+/******************************************************************
+ *		dbg_active_attach
+ *
+ * Tries to attach to a running process
+ * Handles the <pid> or <pid> <evt> forms
+ */
+enum dbg_start  dbg_active_attach(int argc, char* argv[])
+{
+    DWORD       pid, evt;
+
+    /* try the form <myself> pid */
+    if (argc == 1 && str2int(argv[0], &pid) && pid != 0)
+    {
+        if (dbg_attach_debuggee(pid, FALSE, FALSE))
+        {
+            dbg_curr_pid = pid;
+            return start_ok;
+        }
+        return start_error_init;
+    }
+
+    /* try the form <myself> pid evt (Win32 JIT debugger) */
+    if (argc == 2 && str2int(argv[0], &pid) && pid != 0 &&
+        str2int(argv[1], &evt) && evt != 0)
+    {
+        if (!dbg_attach_debuggee(pid, TRUE, FALSE))
+        {
+            /* don't care about result */
+            SetEvent((HANDLE)evt);
+            return start_error_init;
+        }
+        if (!SetEvent((HANDLE)evt))
+        {
+            WINE_ERR("Invalid event handle: %lx\n", evt);
+            return start_error_init;
+        }
+        CloseHandle((HANDLE)evt);
+        dbg_curr_pid = pid;
+	return start_ok;
+    }
+    return start_error_parse;
+}
+
+/******************************************************************
+ *		dbg_active_launch
+ *
+ * Launches a debuggee (with its arguments) from argc/argv
+ */
+enum dbg_start    dbg_active_launch(int argc, char* argv[])
+{
+    int         i, len;
+    LPSTR	cmd_line;
+
+    if (argc == 0) return start_error_parse;
+
+    if (!(cmd_line = HeapAlloc(GetProcessHeap(), 0, len = 1)))
+    {
+    oom_leave:
+        dbg_printf("Out of memory\n");
+        return start_error_init;
+    }
+    cmd_line[0] = '\0';
+
+    for (i = 0; i < argc; i++)
+    {
+        len += strlen(argv[i]) + 1;
+        if (!(cmd_line = HeapReAlloc(GetProcessHeap(), 0, cmd_line, len)))
+            goto oom_leave;
+        strcat(cmd_line, argv[i]);
+        cmd_line[len - 2] = ' ';
+        cmd_line[len - 1] = '\0';
+    }
+
+    if (!dbg_start_debuggee(cmd_line))
+    {
+        HeapFree(GetProcessHeap(), 0, cmd_line);
+        return start_error_init;
+    }
+    HeapFree(GetProcessHeap(), 0, dbg_last_cmd_line);
+    dbg_last_cmd_line = cmd_line;
+    return start_ok;
+}
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index 7ed1410..e1ffe60 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -481,10 +481,13 @@ int main(int argc, char** argv)
     /* Initialize internal vars */
     if (!dbg_load_internal_vars()) return -1;
 
+    /* as we don't care about exec name */
+    argc--; argv++;
+
     /* parse options */
-    while (argc > 1 && argv[1][0] == '-')
+    while (argc > 0 && argv[0][0] == '-')
     {
-        if (!strcmp(argv[1], "--command"))
+        if (!strcmp(argv[0], "--command"))
         {
             char        path[MAX_PATH], file[MAX_PATH];
             DWORD       w;
@@ -499,27 +502,27 @@ int main(int argc, char** argv)
                 dbg_printf("Couldn't open temp file %s (%lu)\n", file, GetLastError());
                 return 1;
             }
-            WriteFile(hFile, argv[1], strlen(argv[1]), &w, 0);
+            WriteFile(hFile, argv[0], strlen(argv[0]), &w, 0);
             WriteFile(hFile, "\nquit\n", 6, &w, 0);
             SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
 
             argc--; argv++;
             continue;
         }
-        if (!strcmp(argv[1], "--file"))
+        if (!strcmp(argv[0], "--file"))
         {
             argc--; argv++;
-            hFile = CreateFileA(argv[1], GENERIC_READ|DELETE, 0, 
+            hFile = CreateFileA(argv[0], GENERIC_READ|DELETE, 0, 
                                 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
             if (hFile == INVALID_HANDLE_VALUE)
             {
-                dbg_printf("Couldn't open file %s (%lu)\n", argv[1], GetLastError());
+                dbg_printf("Couldn't open file %s (%lu)\n", argv[0], GetLastError());
                 return 1;
             }
             argc--; argv++;
             continue;
         }
-        if (!strcmp(argv[1], "--auto"))
+        if (!strcmp(argv[0], "--auto"))
         {
             if (dbg_action_mode != none_mode) return dbg_winedbg_usage();
             dbg_action_mode = automatic_mode;
@@ -529,109 +532,45 @@ int main(int argc, char** argv)
             dbg_houtput = GetStdHandle(STD_ERROR_HANDLE);
             continue;
         }
-        if (!strcmp(argv[1], "--gdb"))
+        if (!strcmp(argv[0], "--gdb"))
         {
             if (dbg_action_mode != none_mode) return dbg_winedbg_usage();
             dbg_action_mode = gdb_mode;
             argc--; argv++;
             continue;
         }
-        if (strcmp(argv[1], "--no-start") == 0 && dbg_action_mode == gdb_mode)
+        if (strcmp(argv[0], "--no-start") == 0 && dbg_action_mode == gdb_mode)
         {
             gdb_flags |= 1;
-            argc--; argv++; /* as we don't use argv[0] */
+            argc--; argv++;
             continue;
         }
-        if (strcmp(argv[1], "--with-xterm") == 0 && dbg_action_mode == gdb_mode)
+        if (strcmp(argv[0], "--with-xterm") == 0 && dbg_action_mode == gdb_mode)
         {
             gdb_flags |= 2;
-            argc--; argv++; /* as we don't use argv[0] */
+            argc--; argv++;
             continue;
         }
         return dbg_winedbg_usage();
     }
 
     if (dbg_action_mode == none_mode) dbg_action_mode = winedbg_mode;
-
-    /* try the form <myself> pid */
-    if (dbg_curr_pid == 0 && argc == 2)
-    {
-        char*   ptr;
-
-        dbg_curr_pid = strtol(argv[1], &ptr, 10);
-        if (dbg_curr_pid == 0 || ptr != argv[1] + strlen(argv[1]) ||
-            !dbg_attach_debuggee(dbg_curr_pid, FALSE, FALSE))
-            dbg_curr_pid = 0;
-    }
-
-    /* try the form <myself> pid evt (Win32 JIT debugger) */
-    if (dbg_curr_pid == 0 && argc == 3)
+    if (!argc || dbg_active_attach(argc, argv) == start_ok ||
+        dbg_active_launch(argc, argv) == start_ok)
     {
-	HANDLE	hEvent;
-	DWORD	pid;
-        char*   ptr;
-
-	if ((pid = strtol(argv[1], &ptr, 10)) != 0 && ptr != NULL &&
-            (hEvent = (HANDLE)strtol(argv[2], &ptr, 10)) != 0 && ptr != NULL)
-        {
-	    if (!dbg_attach_debuggee(pid, TRUE, FALSE))
-            {
-		/* don't care about result */
-		SetEvent(hEvent);
-		goto leave;
-	    }
-	    if (!SetEvent(hEvent))
-            {
-		WINE_ERR("Invalid event handle: %p\n", hEvent);
-		goto leave;
-	    }
-            CloseHandle(hEvent);
-	    dbg_curr_pid = pid;
-	}
+        /* don't save local vars in gdb mode */
+        if (dbg_action_mode == gdb_mode && dbg_curr_pid)
+            return gdb_remote(gdb_flags);
+
+        dbg_init_console();
+
+        SymSetOptions((SymGetOptions() & ~(SYMOPT_UNDNAME)) |
+                      SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS | SYMOPT_AUTO_PUBLICS);
+
+        retv = dbg_main_loop(hFile);
+        /* don't save modified variables in auto mode */
+        if (dbg_action_mode != automatic_mode) dbg_save_internal_vars();
     }
 
-    if (dbg_curr_pid == 0 && argc > 1)
-    {
-	int	i, len;
-	LPSTR	cmdLine;
-
-	if (!(cmdLine = HeapAlloc(GetProcessHeap(), 0, len = 1))) goto oom_leave;
-	cmdLine[0] = '\0';
-
-	for (i = 1; i < argc; i++)
-        {
-	    len += strlen(argv[i]) + 1;
-	    if (!(cmdLine = HeapReAlloc(GetProcessHeap(), 0, cmdLine, len)))
-                goto oom_leave;
-	    strcat(cmdLine, argv[i]);
-	    cmdLine[len - 2] = ' ';
-	    cmdLine[len - 1] = '\0';
-	}
-
-	if (!dbg_start_debuggee(cmdLine))
-        {
-	    dbg_printf("Couldn't start process '%s'\n", cmdLine);
-	    goto leave;
-	}
-	dbg_last_cmd_line = cmdLine;
-    }
-    /* don't save local vars in gdb mode */
-    if (dbg_action_mode == gdb_mode && dbg_curr_pid)
-        return gdb_remote(gdb_flags);
-
-    dbg_init_console();
-
-    SymSetOptions((SymGetOptions() & ~(SYMOPT_UNDNAME)) |
-                  SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS | SYMOPT_AUTO_PUBLICS);
-
-    retv = dbg_main_loop(hFile);
-    /* don't save modified variables in auto mode */
-    if (dbg_action_mode != automatic_mode) dbg_save_internal_vars();
-
-leave:
-    return retv;
-
-oom_leave:
-    dbg_printf("Out of memory\n");
     return retv;
 }





More information about the wine-patches mailing list