Eric Pouech : dbghelp: Improve the symbol loader for .DBG files.
Alexandre Julliard
julliard at winehq.org
Thu Sep 4 08:27:11 CDT 2008
Module: wine
Branch: master
Commit: 2994e9885001f0a117526837a8c71a42de5b4b23
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2994e9885001f0a117526837a8c71a42de5b4b23
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Fri Aug 29 21:50:53 2008 +0200
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 ec221be..26c3a3d 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 a53e6b5..ddc6d3d 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 8f06062..8d926cc 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 283962c..7b62529 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);
More information about the wine-cvs
mailing list