Alexandre Julliard : winedbg: Split minidump option handling to a separate function.

Alexandre Julliard julliard at winehq.org
Tue Jan 17 13:45:29 CST 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jan 16 14:15:12 2012 +0100

winedbg: Split minidump option handling to a separate function.

---

 programs/winedbg/debugger.h   |    2 +
 programs/winedbg/tgt_active.c |  142 +++++++++++++++++++++++------------------
 programs/winedbg/winedbg.c    |   16 +++--
 3 files changed, 94 insertions(+), 66 deletions(-)

diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 9c72916..0ad654f 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -255,6 +255,7 @@ extern	struct dbg_thread*	dbg_curr_thread;
 extern	DWORD_PTR	        dbg_curr_tid;
 extern  CONTEXT 	        dbg_context;
 extern  BOOL                    dbg_interactiveP;
+extern  HANDLE                  dbg_houtput;
 
 struct dbg_internal_var
 {
@@ -419,6 +420,7 @@ 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[]);
 extern enum dbg_start   dbg_active_auto(int argc, char* argv[]);
+extern enum dbg_start   dbg_active_minidump(int argc, char* argv[]);
 extern void             dbg_active_wait_for_first_exception(void);
 extern BOOL             dbg_attach_debuggee(DWORD pid, BOOL cofe);
 
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index 8302e8e..e7f223e 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -757,75 +757,95 @@ enum dbg_start dbg_active_auto(int argc, char* argv[])
     HANDLE              hFile;
     enum dbg_start      ds = start_error_parse;
 
-    if (!strcmp(argv[0], "--auto"))
-    {
-        /* auto mode */
-        argc--; argv++;
-        ds = dbg_active_attach(argc, argv);
-        if (ds != start_ok) {
-            msgbox_res_id(NULL, IDS_INVALID_PARAMS, IDS_AUTO_CAPTION, MB_OK);
-            return ds;
-        }
-        if (!display_crash_dialog()) {
-            dbg_init_console();
-            dbg_start_interactive(INVALID_HANDLE_VALUE);
-            return start_ok;
-        }
-
-        hFile = parser_generate_command_file("echo Modules:", "info share",
-                                             "echo Threads:", "info threads",
-                                             "kill", NULL);
+    DBG_IVAR(BreakOnDllLoad) = 0;
+
+    /* auto mode */
+    argc--; argv++;
+    ds = dbg_active_attach(argc, argv);
+    if (ds != start_ok) {
+        msgbox_res_id(NULL, IDS_INVALID_PARAMS, IDS_AUTO_CAPTION, MB_OK);
+        return ds;
+    }
+    if (!display_crash_dialog()) {
+        dbg_init_console();
+        dbg_start_interactive(INVALID_HANDLE_VALUE);
+        return start_ok;
     }
-    else if (!strcmp(argv[0], "--minidump"))
+
+    hFile = parser_generate_command_file("echo Modules:", "info share",
+                                         "echo Threads:", "info threads",
+                                         "kill", NULL);
+    if (hFile == INVALID_HANDLE_VALUE) return start_error_parse;
+
+    dbg_houtput = GetStdHandle(STD_ERROR_HANDLE);
+
+    if (dbg_curr_process->active_debuggee)
+        dbg_active_wait_for_first_exception();
+
+    dbg_interactiveP = TRUE;
+    parser_handle(hFile);
+
+    return start_ok;
+}
+
+/******************************************************************
+ *		dbg_active_minidump
+ *
+ * Starts (<pid> or <pid> <evt>) in minidump mode
+ */
+enum dbg_start dbg_active_minidump(int argc, char* argv[])
+{
+    HANDLE              hFile;
+    enum dbg_start      ds = start_error_parse;
+    const char*     file = NULL;
+    char            tmp[8 + 1 + MAX_PATH]; /* minidump <file> */
+
+    dbg_houtput = GetStdHandle(STD_ERROR_HANDLE);
+    DBG_IVAR(BreakOnDllLoad) = 0;
+
+    argc--; argv++;
+    /* hard stuff now ; we can get things like:
+     * --minidump <pid>                     1 arg
+     * --minidump <pid> <evt>               2 args
+     * --minidump <file> <pid>              2 args
+     * --minidump <file> <pid> <evt>        3 args
+     */
+    switch (argc)
     {
-        const char*     file = NULL;
-        char            tmp[8 + 1 + MAX_PATH]; /* minidump <file> */
-
-        argc--; argv++;
-        /* hard stuff now ; we can get things like:
-         * --minidump <pid>                     1 arg
-         * --minidump <pid> <evt>               2 args
-         * --minidump <file> <pid>              2 args
-         * --minidump <file> <pid> <evt>        3 args
-         */
-        switch (argc)
+    case 1:
+        ds = dbg_active_attach(argc, argv);
+        break;
+    case 2:
+        if ((ds = dbg_active_attach(argc, argv)) != start_ok)
         {
-        case 1:
-            ds = dbg_active_attach(argc, argv);
-            break;
-        case 2:
-            if ((ds = dbg_active_attach(argc, argv)) != start_ok)
-            {
-                file = argv[0];
-                ds = dbg_active_attach(argc - 1, argv + 1);
-            }
-            break;
-        case 3:
             file = argv[0];
             ds = dbg_active_attach(argc - 1, argv + 1);
-            break;
-        default:
-            return start_error_parse;
         }
-        if (ds != start_ok) return ds;
-        memcpy(tmp, "minidump \"", 10);
-        if (!file)
-        {
-            char        path[MAX_PATH];
+        break;
+    case 3:
+        file = argv[0];
+        ds = dbg_active_attach(argc - 1, argv + 1);
+        break;
+    default:
+        return start_error_parse;
+    }
+    if (ds != start_ok) return ds;
+    memcpy(tmp, "minidump \"", 10);
+    if (!file)
+    {
+        char        path[MAX_PATH];
 
-            GetTempPathA(sizeof(path), path);
-            GetTempFileNameA(path, "WD", 0, tmp + 10);
-        }
-        else strcpy(tmp + 10, file);
-        strcat(tmp, "\"");
-        if (!file)
-        {
-            /* FIXME: should generate unix name as well */
-            dbg_printf("Capturing program state in %s\n", tmp + 9);
-        }
-        hFile = parser_generate_command_file(tmp, "detach", NULL);
+        GetTempPathA(sizeof(path), path);
+        GetTempFileNameA(path, "WD", 0, tmp + 10);
     }
-    else return start_error_parse;
+    else strcpy(tmp + 10, file);
+    strcat(tmp, "\"");
+    if (!file)
+    {
+        /* FIXME: should generate unix name as well */
+        dbg_printf("Capturing program state in %s\n", tmp + 9);
+    }
+    hFile = parser_generate_command_file(tmp, "detach", NULL);
     if (hFile == INVALID_HANDLE_VALUE) return start_error_parse;
 
     if (dbg_curr_process->active_debuggee)
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index a3a9f16..c5f4448 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -89,11 +89,11 @@ DWORD_PTR	        dbg_curr_tid = 0;
 DWORD_PTR	        dbg_curr_pid = 0;
 CONTEXT                 dbg_context;
 BOOL    	        dbg_interactiveP = FALSE;
+HANDLE                  dbg_houtput = 0;
 
 static struct list      dbg_process_list = LIST_INIT(dbg_process_list);
 
 struct dbg_internal_var         dbg_internal_vars[DBG_IV_LAST];
-static HANDLE                   dbg_houtput;
 
 static void dbg_outputA(const char* buffer, int len)
 {
@@ -668,11 +668,8 @@ int main(int argc, char** argv)
     SymSetOptions((SymGetOptions() & ~(SYMOPT_UNDNAME)) |
                   SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS | SYMOPT_AUTO_PUBLICS);
 
-    if (argc && (!strcmp(argv[0], "--auto") || !strcmp(argv[0], "--minidump")))
+    if (argc && !strcmp(argv[0], "--auto"))
     {
-        /* force some internal variables */
-        DBG_IVAR(BreakOnDllLoad) = 0;
-        dbg_houtput = GetStdHandle(STD_ERROR_HANDLE);
         switch (dbg_active_auto(argc, argv))
         {
         case start_ok:          return 0;
@@ -680,6 +677,15 @@ int main(int argc, char** argv)
         case start_error_init:  return -1;
         }
     }
+    if (argc && !strcmp(argv[0], "--minidump"))
+    {
+        switch (dbg_active_minidump(argc, argv))
+        {
+        case start_ok:          return 0;
+        case start_error_parse: return dbg_winedbg_usage(FALSE);
+        case start_error_init:  return -1;
+        }
+    }
     /* parse options */
     while (argc > 0 && argv[0][0] == '-')
     {




More information about the wine-cvs mailing list