From 2994e9885001f0a117526837a8c71a42de5b4b23 Mon Sep 17 00:00:00 2001 From: Eric Pouech <eric.pouech@orange.fr> Date: Fri, 29 Aug 2008 21:50:53 +0200 Subject: [PATCH] dbghelp: Improve the symbol loader for .DBG files. When looking for a .DBG file, first look for a .DBG file matching all attributes, then for a .DBG partially matching the attributes. --- dlls/dbghelp/dbghelp_private.h | 3 +- dlls/dbghelp/module.c | 4 +++ dlls/dbghelp/path.c | 35 +++++++++++++++++++- dlls/dbghelp/pe_module.c | 58 +++++++++++----------------------- 4 files changed, 58 insertions(+), 42 deletions(-) diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index ec221bedb0c..26c3a3dd403 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -303,7 +303,8 @@ enum module_type DMT_UNKNOWN, /* for lookup, not actually used for a module */ DMT_ELF, /* a real ELF shared module */ DMT_PE, /* a native or builtin PE module */ - DMT_PDB, /* PDB file */ + DMT_PDB, /* .PDB file */ + DMT_DBG, /* .DBG file */ }; struct process; diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index a53e6b568b9..ddc6d3d89bd 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -36,6 +36,7 @@ const WCHAR S_ElfW[] = {'<','e','l','f','>','\0'}; const WCHAR S_WineLoaderW[] = {'<','w','i','n','e','-','l','o','a','d','e','r','>','\0'}; static const WCHAR S_DotSoW[] = {'.','s','o','\0'}; static const WCHAR S_DotPdbW[] = {'.','p','d','b','\0'}; +static const WCHAR S_DotDbgW[] = {'.','d','b','g','\0'}; const WCHAR S_WinePThreadW[] = {'w','i','n','e','-','p','t','h','r','e','a','d','\0'}; const WCHAR S_WineKThreadW[] = {'w','i','n','e','-','k','t','h','r','e','a','d','\0'}; const WCHAR S_SlashW[] = {'/','\0'}; @@ -424,6 +425,9 @@ enum module_type module_get_type_by_name(const WCHAR* name) if (len > 4 && !strncmpiW(name + len - 4, S_DotPdbW, 4)) return DMT_PDB; + if (len > 4 && !strncmpiW(name + len - 4, S_DotDbgW, 4)) + return DMT_DBG; + /* wine-[kp]thread is also an ELF module */ if (((len > 12 && name[len - 13] == '/') || len == 12) && (!strncmpiW(name + len - 12, S_WinePThreadW, 12) || diff --git a/dlls/dbghelp/path.c b/dlls/dbghelp/path.c index 8f06062ed29..8d926ccd366 100644 --- a/dlls/dbghelp/path.c +++ b/dlls/dbghelp/path.c @@ -453,6 +453,9 @@ static BOOL CALLBACK sffip_cb(PCWSTR buffer, PVOID user) } } break; + case DMT_DBG: + FIXME("NIY\n"); + break; default: FIXME("What the heck??\n"); return FALSE; @@ -581,7 +584,7 @@ struct module_find static BOOL CALLBACK module_find_cb(PCWSTR buffer, PVOID user) { struct module_find* mf = (struct module_find*)user; - DWORD size, checksum; + DWORD size, checksum, timestamp; unsigned matched = 0; /* the matching weights: @@ -685,6 +688,36 @@ static BOOL CALLBACK module_find_cb(PCWSTR buffer, PVOID user) } } break; + case DMT_DBG: + { + HANDLE hFile, hMap; + void* mapping; + + timestamp = ~mf->dw1; + hFile = CreateFileW(buffer, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) return FALSE; + if ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != NULL) + { + if ((mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL) + { + const IMAGE_SEPARATE_DEBUG_HEADER* hdr; + hdr = (const IMAGE_SEPARATE_DEBUG_HEADER*)mapping; + + if (hdr->Signature == IMAGE_SEPARATE_DEBUG_SIGNATURE) + { + matched++; + timestamp = hdr->TimeDateStamp; + } + UnmapViewOfFile(mapping); + } + CloseHandle(hMap); + } + CloseHandle(hFile); + if (timestamp == mf->dw1) matched++; + else WARN("Found %s, but wrong timestamp\n", debugstr_w(buffer)); + } + break; default: FIXME("What the heck??\n"); return FALSE; diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c index 283962cb367..7b62529a211 100644 --- a/dlls/dbghelp/pe_module.c +++ b/dlls/dbghelp/pe_module.c @@ -79,12 +79,6 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module, return ret; } -static BOOL CALLBACK dbg_match(const char* file, void* user) -{ - /* accept first file */ - return FALSE; -} - /****************************************************************** * pe_load_dbg_file * @@ -96,51 +90,35 @@ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module, char tmp[MAX_PATH]; HANDLE hFile = INVALID_HANDLE_VALUE, hMap = 0; const BYTE* dbg_mapping = NULL; - const IMAGE_SEPARATE_DEBUG_HEADER* hdr; - const IMAGE_DEBUG_DIRECTORY* dbg; BOOL ret = FALSE; - WINE_TRACE("Processing DBG file %s\n", debugstr_a(dbg_name)); + TRACE("Processing DBG file %s\n", debugstr_a(dbg_name)); - if (SymFindFileInPath(pcs->handle, NULL, dbg_name, NULL, 0, 0, 0, tmp, dbg_match, NULL) && + if (path_find_symbol_file(pcs, dbg_name, NULL, timestamp, 0, tmp) && (hFile = CreateFileA(tmp, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE && ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != 0) && ((dbg_mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL)) { + const IMAGE_SEPARATE_DEBUG_HEADER* hdr; + const IMAGE_SECTION_HEADER* sectp; + const IMAGE_DEBUG_DIRECTORY* dbg; + hdr = (const IMAGE_SEPARATE_DEBUG_HEADER*)dbg_mapping; - if (hdr->TimeDateStamp != timestamp) - { - WINE_ERR("Warning - %s has incorrect internal timestamp\n", - debugstr_a(dbg_name)); - /* - * Well, sometimes this happens to DBG files which ARE REALLY the - * right .DBG files but nonetheless this check fails. Anyway, - * WINDBG (debugger for Windows by Microsoft) loads debug symbols - * which have incorrect timestamps. - */ - } - if (hdr->Signature == IMAGE_SEPARATE_DEBUG_SIGNATURE) - { - /* section headers come immediately after debug header */ - const IMAGE_SECTION_HEADER *sectp = - (const IMAGE_SECTION_HEADER*)(hdr + 1); - /* and after that and the exported names comes the debug directory */ - dbg = (const IMAGE_DEBUG_DIRECTORY*) - (dbg_mapping + sizeof(*hdr) + - hdr->NumberOfSections * sizeof(IMAGE_SECTION_HEADER) + - hdr->ExportedNamesSize); - - - ret = pe_load_debug_directory(pcs, module, dbg_mapping, sectp, - hdr->NumberOfSections, dbg, - hdr->DebugDirectorySize / sizeof(*dbg)); - } - else - ERR("Wrong signature in .DBG file %s\n", debugstr_a(tmp)); + /* section headers come immediately after debug header */ + sectp = (const IMAGE_SECTION_HEADER*)(hdr + 1); + /* and after that and the exported names comes the debug directory */ + dbg = (const IMAGE_DEBUG_DIRECTORY*) + (dbg_mapping + sizeof(*hdr) + + hdr->NumberOfSections * sizeof(IMAGE_SECTION_HEADER) + + hdr->ExportedNamesSize); + + ret = pe_load_debug_directory(pcs, module, dbg_mapping, sectp, + hdr->NumberOfSections, dbg, + hdr->DebugDirectorySize / sizeof(*dbg)); } else - WINE_ERR("-Unable to peruse .DBG file %s (%s)\n", debugstr_a(dbg_name), debugstr_a(tmp)); + ERR("Couldn't find .DBG file %s (%s)\n", debugstr_a(dbg_name), debugstr_a(tmp)); if (dbg_mapping) UnmapViewOfFile(dbg_mapping); if (hMap) CloseHandle(hMap); -- GitLab