Eric Pouech : winedbg: Search default debuggee dir for symbol information.
Alexandre Julliard
julliard at winehq.org
Thu Sep 4 08:27:12 CDT 2008
Module: wine
Branch: master
Commit: 6986975816c977e621bf76745dc9c4a0f43eebef
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6986975816c977e621bf76745dc9c4a0f43eebef
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Sat Aug 30 08:44:48 2008 +0200
winedbg: Search default debuggee dir for symbol information.
---
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-cvs
mailing list