[PATCH 3/3] [WineDbg]: added scoped symbol picker, and options to handle it

Eric Pouech eric.pouech at orange.fr
Mon Nov 10 08:03:10 CST 2008




A+
---

 programs/winedbg/debugger.h |    2 ++
 programs/winedbg/symbol.c   |   32 ++++++++++++++++++++++++++++++++
 programs/winedbg/winedbg.c  |   15 +++++++++++++++
 3 files changed, 49 insertions(+), 0 deletions(-)


diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 12ab719..319f0dc 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -401,6 +401,8 @@ typedef enum sym_get_lval (*symbol_picker_t)(const char* name, const struct sgv_
 extern symbol_picker_t symbol_current_picker;
 extern enum sym_get_lval symbol_picker_interactive(const char* name, const struct sgv_data* sgv,
                                                    struct dbg_lvalue* rtn);
+extern enum sym_get_lval symbol_picker_scoped(const char* name, const struct sgv_data* sgv,
+                                              struct dbg_lvalue* rtn);
 
   /* tgt_active.c */
 extern void             dbg_run_debuggee(const char* args);
diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c
index 56f814b..90c5510 100644
--- a/programs/winedbg/symbol.c
+++ b/programs/winedbg/symbol.c
@@ -251,6 +251,38 @@ enum sym_get_lval symbol_picker_interactive(const char* name, const struct sgv_d
     return sglv_found;
 }
 
+enum sym_get_lval symbol_picker_scoped(const char* name, const struct sgv_data* sgv,
+                                       struct dbg_lvalue* rtn)
+{
+    unsigned i;
+    int local = -1;
+
+    for (i = 0; i < sgv->num; i++)
+    {
+        if (sgv->num - sgv->num_thunks > 1 && (sgv->syms[i].flags & SYMFLAG_THUNK) && !DBG_IVAR(AlwaysShowThunks))
+            continue;
+        if (sgv->syms[i].flags & SYMFLAG_LOCAL)
+        {
+            if (local == -1)
+                local = i;
+            else
+            {
+                /* FIXME: several locals with same name... which one to pick ?? */
+                dbg_printf("Several local variables/parameters for %s, aborting\n", name);
+                return sglv_aborted;
+            }
+        }
+    }
+    if (local != -1)
+    {
+        *rtn = sgv->syms[local].lvalue;
+        return sglv_found;
+    }
+    /* no locals found, multiple globals... abort for now */
+    dbg_printf("Several global variables for %s, aborting\n", name);
+    return sglv_aborted;
+}
+
 symbol_picker_t symbol_current_picker = symbol_picker_interactive;
 
 /***********************************************************************
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index 3fefd4c..d1df695 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -517,6 +517,21 @@ void dbg_set_option(const char* option, const char* val)
         }
         SymSetOptions(opt);
     }
+    else if (!strcasecmp(option, "symbol_picker"))
+    {
+        if (!val)
+            dbg_printf("Option: symbol_picker %s\n",
+                       symbol_current_picker == symbol_picker_interactive ? "interactive" : "scoped");
+        else if (!strcasecmp(val, "interactive"))
+            symbol_current_picker = symbol_picker_interactive;
+        else if (!strcasecmp(val, "scoped"))
+            symbol_current_picker = symbol_picker_scoped;
+        else
+        {
+            dbg_printf("Syntax: symbol_picker [interactive|scoped]\n");
+            return;
+        }
+    }
     else dbg_printf("Unknown option '%s'\n", option);
 }
 





More information about the wine-patches mailing list