Use dbghelp for prodding DLLs. Leaving old code in place for now
until this gets some testing, but if it works well then we can kill a few hundred lines of code.
This commit is contained in:
@@ -458,7 +458,7 @@ typedef BOOL (__stdcall *PGETMODULEINFORMATION)(HANDLE, HMODULE, Win32ModuleInfo
|
|||||||
typedef HANDLE (__stdcall *PCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
|
typedef HANDLE (__stdcall *PCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
|
||||||
typedef BOOL (WINAPI *PMODULE32FIRST)(HANDLE, LPMODULEENTRY32);
|
typedef BOOL (WINAPI *PMODULE32FIRST)(HANDLE, LPMODULEENTRY32);
|
||||||
typedef BOOL (WINAPI *PMODULE32NEXT)(HANDLE, LPMODULEENTRY32);
|
typedef BOOL (WINAPI *PMODULE32NEXT)(HANDLE, LPMODULEENTRY32);
|
||||||
|
/*
|
||||||
static ModuleInfo *CrashGetModules(void *&ptr) {
|
static ModuleInfo *CrashGetModules(void *&ptr) {
|
||||||
void *pMem = VirtualAlloc(NULL, 65536, MEM_COMMIT, PAGE_READWRITE);
|
void *pMem = VirtualAlloc(NULL, 65536, MEM_COMMIT, PAGE_READWRITE);
|
||||||
|
|
||||||
@@ -596,7 +596,7 @@ static ModuleInfo *CrashGetModules(void *&ptr) {
|
|||||||
ptr = NULL;
|
ptr = NULL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// info from Portable Executable/Common Object File Format (PE/COFF) spec
|
// info from Portable Executable/Common Object File Format (PE/COFF) spec
|
||||||
@@ -717,6 +717,7 @@ struct PE32PlusOptionalHeader {
|
|||||||
ulong export_size; // 116
|
ulong export_size; // 116
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
static const char *CrashLookupExport(HMODULE hmod, unsigned long addr, unsigned long &fnbase) {
|
static const char *CrashLookupExport(HMODULE hmod, unsigned long addr, unsigned long &fnbase) {
|
||||||
char *pBase = (char *)hmod;
|
char *pBase = (char *)hmod;
|
||||||
|
|
||||||
@@ -826,6 +827,7 @@ static const char *CrashLookupExport(HMODULE hmod, unsigned long addr, unsigned
|
|||||||
|
|
||||||
return pszName;
|
return pszName;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -1055,7 +1057,7 @@ long VDDebugInfoLookupRVA(VDDebugInfoContext *pctx, unsigned rva, char *buf, int
|
|||||||
#include "dbghelp.h"
|
#include "dbghelp.h"
|
||||||
#pragma comment(lib, "dbghelp.lib")
|
#pragma comment(lib, "dbghelp.lib")
|
||||||
|
|
||||||
static const char *Demangle( const char *buf )
|
static bool InitDbghelp()
|
||||||
{
|
{
|
||||||
static bool initted = false;
|
static bool initted = false;
|
||||||
if( !initted )
|
if( !initted )
|
||||||
@@ -1063,13 +1065,36 @@ static const char *Demangle( const char *buf )
|
|||||||
SymSetOptions( SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS );
|
SymSetOptions( SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS );
|
||||||
|
|
||||||
if (!SymInitialize(GetCurrentProcess(), NULL, TRUE))
|
if (!SymInitialize(GetCurrentProcess(), NULL, TRUE))
|
||||||
return buf;
|
return false;
|
||||||
|
|
||||||
initted = true;
|
initted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char obuf[1024];
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SYMBOL_INFO *GetSym( unsigned long ptr, DWORD64 &disp )
|
||||||
|
{
|
||||||
|
InitDbghelp();
|
||||||
|
|
||||||
|
static BYTE buffer[1024];
|
||||||
|
SYMBOL_INFO *pSymbol = (PSYMBOL_INFO)buffer;
|
||||||
|
|
||||||
|
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
|
||||||
|
pSymbol->MaxNameLen = sizeof(buffer) - sizeof(SYMBOL_INFO) + 1;
|
||||||
|
|
||||||
|
if (!SymFromAddr(GetCurrentProcess(), ptr, &disp, pSymbol))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return pSymbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *Demangle( const char *buf )
|
||||||
|
{
|
||||||
|
if( !InitDbghelp() )
|
||||||
|
return buf;
|
||||||
|
|
||||||
|
static char obuf[1024];
|
||||||
if( !UnDecorateSymbolName(buf, obuf, sizeof(obuf),
|
if( !UnDecorateSymbolName(buf, obuf, sizeof(obuf),
|
||||||
UNDNAME_COMPLETE
|
UNDNAME_COMPLETE
|
||||||
| UNDNAME_NO_CV_THISTYPE
|
| UNDNAME_NO_CV_THISTYPE
|
||||||
@@ -1080,6 +1105,13 @@ static const char *Demangle( const char *buf )
|
|||||||
{
|
{
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( obuf[0] == '_' )
|
||||||
|
{
|
||||||
|
strcat( obuf, "()" ); /* _main -> _main() */
|
||||||
|
return obuf+1; /* _main -> main */
|
||||||
|
}
|
||||||
|
|
||||||
return obuf;
|
return obuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1105,7 +1137,7 @@ static bool ReportCrashCallStack(HWND hwnd, HANDLE hFile, const EXCEPTION_POINTE
|
|||||||
// Get some module names.
|
// Get some module names.
|
||||||
|
|
||||||
void *pModuleMem;
|
void *pModuleMem;
|
||||||
ModuleInfo *pModules = CrashGetModules(pModuleMem);
|
// ModuleInfo *pModules = CrashGetModules(pModuleMem);
|
||||||
|
|
||||||
// Retrieve stack pointers.
|
// Retrieve stack pointers.
|
||||||
// Not sure if NtCurrentTeb() is available on Win95....
|
// Not sure if NtCurrentTeb() is available on Win95....
|
||||||
@@ -1150,6 +1182,26 @@ static bool ReportCrashCallStack(HWND hwnd, HANDLE hFile, const EXCEPTION_POINTE
|
|||||||
Report(hwnd, hFile, "%08lx: %s", data, Demangle(buf));
|
Report(hwnd, hFile, "%08lx: %s", data, Demangle(buf));
|
||||||
--limit;
|
--limit;
|
||||||
} else {
|
} else {
|
||||||
|
char szName[MAX_PATH];
|
||||||
|
if( !CrashGetModuleBaseName((HMODULE)meminfo.AllocationBase, szName) )
|
||||||
|
strcpy( szName, "???" );
|
||||||
|
|
||||||
|
DWORD64 disp;
|
||||||
|
SYMBOL_INFO *pSymbol = GetSym( data, disp );
|
||||||
|
|
||||||
|
if( pSymbol )
|
||||||
|
{
|
||||||
|
Report(hwnd, hFile, "%08lx: %s!%s [%08lx+%lx+%lx]",
|
||||||
|
(unsigned long) data, szName, pSymbol->Name,
|
||||||
|
(unsigned long) meminfo.AllocationBase,
|
||||||
|
(unsigned long) (pSymbol->Address) - (unsigned long) (meminfo.AllocationBase),
|
||||||
|
(unsigned long) disp);
|
||||||
|
} else {
|
||||||
|
Report(hwnd, hFile, "%08lx: %s!%08lx",
|
||||||
|
(unsigned long) data, szName,
|
||||||
|
(unsigned long) meminfo.AllocationBase );
|
||||||
|
}
|
||||||
|
/*
|
||||||
ModuleInfo *pMods = pModules;
|
ModuleInfo *pMods = pModules;
|
||||||
ModuleInfo mi;
|
ModuleInfo mi;
|
||||||
char szName[MAX_PATH];
|
char szName[MAX_PATH];
|
||||||
@@ -1184,7 +1236,7 @@ static bool ReportCrashCallStack(HWND hwnd, HANDLE hFile, const EXCEPTION_POINTE
|
|||||||
Report(hwnd, hFile, "%08lx: %s!%08lx", data, mi.name, data - mi.base);
|
Report(hwnd, hFile, "%08lx: %s!%08lx", data, mi.name, data - mi.base);
|
||||||
} else
|
} else
|
||||||
Report(hwnd, hFile, "%08lx: %08lx", data, data);
|
Report(hwnd, hFile, "%08lx: %08lx", data, data);
|
||||||
|
*/
|
||||||
--limit;
|
--limit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user