[PATCH] [WineDbg]: search default debuggee dir for symbol information

Eric Pouech eric.pouech at orange.fr
Sat Aug 30 01:44:48 CDT 2008




A+
---

 programs/winedbg/debugger.h     |    1 +
 programs/winedbg/gdbproxy.c     |    2 +-
 programs/winedbg/tgt_active.c   |    2 +-
 programs/winedbg/tgt_minidump.c |    2 +-
 programs/winedbg/tgt_module.c   |    2 +-
 programs/winedbg/winedbg.c      |   39 +++++++++++++++++++++++++++++++++++++++
 6 files changed, 44 insertions(+), 4 deletions(-)


diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 3fb650d..a8a3fc3 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -446,6 +446,7 @@ extern void             dbg_del_process(struct dbg_process* p);
 struct dbg_thread*	dbg_add_thread(struct dbg_process* p, DWORD tid, HANDLE h, void* teb);
 extern struct dbg_thread* dbg_get_thread(struct dbg_process* p, DWORD tid);
 extern void             dbg_del_thread(struct dbg_thread* t);
+extern BOOL             dbg_init(HANDLE hProc, const char* in, BOOL invade);
 extern BOOL             dbg_get_debuggee_info(HANDLE hProcess, IMAGEHLP_MODULE* imh_mod);
 
   /* gdbproxy.c */
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 2fbec04..dc80a84 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -505,7 +505,7 @@ static	void	handle_debug_event(struct gdb_context* gdbctx, DEBUG_EVENT* de)
                     de->u.CreateProcessInfo.nDebugInfoSize);
 
         /* de->u.CreateProcessInfo.lpStartAddress; */
-        if (!SymInitialize(gdbctx->process->handle, NULL, TRUE))
+        if (!dbg_init(gdbctx->process->handle, buffer, TRUE))
             fprintf(stderr, "Couldn't initiate DbgHelp\n");
 
         if (gdbctx->trace & GDBPXY_TRC_WIN32_EVENT)
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index 5fba6fa..75f22ad 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -509,7 +509,7 @@ static unsigned dbg_handle_debug_event(DEBUG_EVENT* de)
                    de->u.CreateProcessInfo.nDebugInfoSize);
         dbg_set_process_name(dbg_curr_process, buffer);
 
-        if (!SymInitialize(dbg_curr_process->handle, NULL, FALSE))
+        if (!dbg_init(dbg_curr_process->handle, buffer, FALSE))
             dbg_printf("Couldn't initiate DbgHelp\n");
         if (!SymLoadModule(dbg_curr_process->handle, de->u.CreateProcessInfo.hFile, buffer, NULL,
                            (unsigned long)de->u.CreateProcessInfo.lpBaseOfImage, 0))
diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c
index 87f34a2..8d623dc 100644
--- a/programs/winedbg/tgt_minidump.c
+++ b/programs/winedbg/tgt_minidump.c
@@ -304,7 +304,7 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data)
     dbg_curr_process->pio_data = data;
     dbg_set_process_name(dbg_curr_process, exec_name);
 
-    SymInitialize(hProc, NULL, FALSE);
+    dbg_init(hProc, NULL, FALSE);
 
     if (MiniDumpReadDumpStream(data->mapping, ThreadListStream, &dir, &stream, &size))
     {
diff --git a/programs/winedbg/tgt_module.c b/programs/winedbg/tgt_module.c
index ced9d85..044e312 100644
--- a/programs/winedbg/tgt_module.c
+++ b/programs/winedbg/tgt_module.c
@@ -55,7 +55,7 @@ enum dbg_start tgt_module_load(const char* name, BOOL keep)
 
     SymSetOptions((opts & ~(SYMOPT_UNDNAME|SYMOPT_DEFERRED_LOADS)) |
                   SYMOPT_LOAD_LINES | SYMOPT_AUTO_PUBLICS | 0x40000000);
-    if (!SymInitialize(hDummy, NULL, FALSE))
+    if (!dbg_init(hDummy, NULL, FALSE))
         return start_error_init;
     if (!SymLoadModule(hDummy, NULL, name, NULL, 0, 0))
     {
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index 26f422f..5cbc68f 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -346,6 +346,45 @@ void dbg_del_process(struct dbg_process* p)
     HeapFree(GetProcessHeap(), 0, p);
 }
 
+/******************************************************************
+ *		dbg_init
+ *
+ * Initializes the dbghelp library, and also sets the application directory
+ * as a place holder for symbol searches.
+ */
+BOOL dbg_init(HANDLE hProc, const char* in, BOOL invade)
+{
+    BOOL        ret;
+
+    ret = SymInitialize(hProc, NULL, invade);
+    if (ret && in)
+    {
+        const char*     last;
+
+        for (last = in + strlen(in) - 1; last >= in; last--)
+        {
+            if (*last == '/' || *last == '\\')
+            {
+                char*       tmp;
+                tmp = HeapAlloc(GetProcessHeap(), 0, 1024 + 1 + (last - in) + 1);
+                if (tmp && SymGetSearchPath(hProc, tmp, 1024))
+                {
+                    char*       x = tmp + strlen(tmp);
+
+                    *x++ = ';';
+                    memcpy(x, in, last - in);
+                    x[last - in] = '\0';
+                    ret = SymSetSearchPath(hProc, tmp);
+                }
+                else ret = FALSE;
+                HeapFree(GetProcessHeap(), 0, tmp);
+                break;
+            }
+        }
+    }
+    return ret;
+}
+
 struct mod_loader_info
 {
     HANDLE              handle;





More information about the wine-patches mailing list