[PATCH 05/12] [WineDbg]: auto mode

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


- rewrite auto mode startup
- move part of auto handling to tgt_active.c

A+
---

 programs/winedbg/debugger.h   |    3 +
 programs/winedbg/tgt_active.c |   12 ++++
 programs/winedbg/winedbg.c    |  116 +++++++++++++++++++++--------------------
 3 files changed, 74 insertions(+), 57 deletions(-)

diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 91b4b70..38ad642 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -372,8 +372,9 @@ extern void             dbg_run_debuggee
 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[]);
   /* temporary for tgt_active.c */
-extern enum dbg_action_mode {none_mode = 0, winedbg_mode, automatic_mode} dbg_action_mode;
+extern enum dbg_action_mode {winedbg_mode, automatic_mode} dbg_action_mode;
 extern unsigned         dbg_main_loop(HANDLE);
 
   /* tgt_minidump.c */
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index 335ae5c..226227c 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -872,3 +872,15 @@ enum dbg_start    dbg_active_launch(int 
     dbg_last_cmd_line = cmd_line;
     return start_ok;
 }
+
+/******************************************************************
+ *		dbg_active_auto
+ *
+ * Starts (<pid> or <pid> <evt>) in automatic mode
+ */
+enum dbg_start dbg_active_auto(int argc, char* argv[])
+{
+    argc--; argv++;
+    dbg_action_mode = automatic_mode;
+    return dbg_active_attach(argc, argv);
+}
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index 1978d37..e8678c4 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -462,8 +462,9 @@ extern struct backend_cpu be_alpha;
 
 int main(int argc, char** argv)
 {
-    int 	retv = 0;
-    HANDLE      hFile = INVALID_HANDLE_VALUE;
+    int 	        retv = 0;
+    HANDLE              hFile = INVALID_HANDLE_VALUE;
+    enum dbg_start      ds;
 
 #ifdef __i386__
     be_cpu = &be_i386;
@@ -489,71 +490,74 @@ int main(int argc, char** argv)
         if (retv == -1) dbg_winedbg_usage();
         return retv;
     }
+    dbg_init_console();
+    dbg_action_mode = winedbg_mode;
 
-    /* parse options */
-    while (argc > 0 && argv[0][0] == '-')
+    SymSetOptions((SymGetOptions() & ~(SYMOPT_UNDNAME)) |
+                  SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS | SYMOPT_AUTO_PUBLICS);
+
+    if (argc && !strcmp(argv[0], "--auto"))
+    {
+        /* force some internal variables */
+        DBG_IVAR(BreakOnDllLoad) = 0;
+        dbg_houtput = GetStdHandle(STD_ERROR_HANDLE);
+        ds = dbg_active_auto(argc, argv);
+    }
+    else
     {
-        if (!strcmp(argv[0], "--command"))
+        /* parse options */
+        while (argc > 0 && argv[0][0] == '-')
         {
-            char        path[MAX_PATH], file[MAX_PATH];
-            DWORD       w;
-
-            GetTempPath(sizeof(path), path);
-            GetTempFileName(path, "WD", 0, file);
-            argc--; argv++;
-            hFile = CreateFileA(file, GENERIC_READ|GENERIC_WRITE|DELETE, FILE_SHARE_DELETE, 
-                                NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0);
-            if (hFile == INVALID_HANDLE_VALUE)
+            if (!strcmp(argv[0], "--command"))
             {
-                dbg_printf("Couldn't open temp file %s (%lu)\n", file, GetLastError());
-                return 1;
-            }
-            WriteFile(hFile, argv[0], strlen(argv[0]), &w, 0);
-            WriteFile(hFile, "\nquit\n", 6, &w, 0);
-            SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
+                char        path[MAX_PATH], file[MAX_PATH];
+                DWORD       w;
 
-            argc--; argv++;
-            continue;
-        }
-        if (!strcmp(argv[0], "--file"))
-        {
-            argc--; argv++;
-            hFile = CreateFileA(argv[0], GENERIC_READ|DELETE, 0, 
-                                NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
-            if (hFile == INVALID_HANDLE_VALUE)
+                GetTempPath(sizeof(path), path);
+                GetTempFileName(path, "WD", 0, file);
+                argc--; argv++;
+                hFile = CreateFileA(file, GENERIC_READ|GENERIC_WRITE|DELETE, FILE_SHARE_DELETE, 
+                                    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0);
+                if (hFile == INVALID_HANDLE_VALUE)
+                {
+                    dbg_printf("Couldn't open temp file %s (%lu)\n", file, GetLastError());
+                    return 1;
+                }
+                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[0], "--file"))
             {
-                dbg_printf("Couldn't open file %s (%lu)\n", argv[0], GetLastError());
-                return 1;
+                argc--; argv++;
+                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[0], GetLastError());
+                    return 1;
+                }
+                argc--; argv++;
+                continue;
             }
-            argc--; argv++;
-            continue;
-        }
-        if (!strcmp(argv[0], "--auto"))
-        {
-            if (dbg_action_mode != none_mode) return dbg_winedbg_usage();
-            dbg_action_mode = automatic_mode;
-            /* force some internal variables */
-            DBG_IVAR(BreakOnDllLoad) = 0;
-            argc--; argv++;
-            dbg_houtput = GetStdHandle(STD_ERROR_HANDLE);
-            continue;
+            return dbg_winedbg_usage();
         }
-        return dbg_winedbg_usage();
+        if (!argc) ds = start_ok;
+        else if ((ds = dbg_active_attach(argc, argv)) == start_error_parse)
+            ds = dbg_active_launch(argc, argv);
     }
-
-    if (dbg_action_mode == none_mode) dbg_action_mode = winedbg_mode;
-    if (!argc || dbg_active_attach(argc, argv) == start_ok ||
-        dbg_active_launch(argc, argv) == start_ok)
+    switch (ds)
     {
-        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();
+    case start_ok:              break;
+    case start_error_parse:     return dbg_winedbg_usage();
+    case start_error_init:      return -1;
     }
+    retv = dbg_main_loop(hFile);
+    /* don't save modified variables in auto mode */
+    if (dbg_action_mode != automatic_mode) dbg_save_internal_vars();
 
     return retv;
 }





More information about the wine-patches mailing list