Module: wine Branch: master Commit: 6986975816c977e621bf76745dc9c4a0f43eebef URL: http://source.winehq.org/git/wine.git/?a=commit;h=6986975816c977e621bf76745d...
Author: Eric Pouech eric.pouech@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;