Bug 297723 stackwalk code not working for WinXP

patch by colin@theblakes.com r=dougt a=asa
This commit is contained in:
timeless%mozdev.org 2005-07-01 05:21:02 +00:00
Родитель b27d75c5b3
Коммит ead709b608
2 изменённых файлов: 50 добавлений и 46 удалений

Просмотреть файл

@ -60,35 +60,35 @@ SYMINITIALIZEPROC _SymInitialize;
SYMCLEANUPPROC _SymCleanup;
STACKWALKPROC _StackWalk;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
STACKWALKPROC64 _StackWalk64;
#else
#define _StackWalk64 0
#endif
SYMFUNCTIONTABLEACCESSPROC _SymFunctionTableAccess;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
SYMFUNCTIONTABLEACCESSPROC64 _SymFunctionTableAccess64;
#else
#define _SymFunctionTableAccess64 0
#endif
SYMGETMODULEBASEPROC _SymGetModuleBase;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
SYMGETMODULEBASEPROC64 _SymGetModuleBase64;
#else
#define _SymGetModuleBase64 0
#endif
SYMGETSYMFROMADDRPROC _SymGetSymFromAddr;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
SYMFROMADDRPROC _SymFromAddr;
#else
#define _SymFromAddr 0
#endif
SYMLOADMODULE _SymLoadModule;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
SYMLOADMODULE64 _SymLoadModule64;
#else
#define _SymLoadModule64 0
@ -97,21 +97,21 @@ SYMLOADMODULE64 _SymLoadModule64;
SYMUNDNAME _SymUnDName;
SYMGETMODULEINFO _SymGetModuleInfo;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
SYMGETMODULEINFO64 _SymGetModuleInfo64;
#else
#define _SymGetModuleInfo64 0
#endif
ENUMLOADEDMODULES _EnumerateLoadedModules;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
ENUMLOADEDMODULES64 _EnumerateLoadedModules64;
#else
#define _EnumerateLoadedModules64 0
#endif
SYMGETLINEFROMADDRPROC _SymGetLineFromAddr;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
SYMGETLINEFROMADDRPROC64 _SymGetLineFromAddr64;
#else
#define _SymGetLineFromAddr64 0
@ -176,31 +176,31 @@ EnsureImageHlpInitialized()
_SymCleanup = (SYMCLEANUPPROC)GetProcAddress(module, "SymCleanup");
if (!_SymCleanup) return PR_FALSE;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_StackWalk64 = (STACKWALKPROC64)GetProcAddress(module, "StackWalk64");
#endif
_StackWalk = (STACKWALKPROC)GetProcAddress(module, "StackWalk");
if (!_StackWalk64 && !_StackWalk) return PR_FALSE;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_SymFunctionTableAccess64 = (SYMFUNCTIONTABLEACCESSPROC64) GetProcAddress(module, "SymFunctionTableAccess64");
#endif
_SymFunctionTableAccess = (SYMFUNCTIONTABLEACCESSPROC) GetProcAddress(module, "SymFunctionTableAccess");
if (!_SymFunctionTableAccess64 && !_SymFunctionTableAccess) return PR_FALSE;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_SymGetModuleBase64 = (SYMGETMODULEBASEPROC64)GetProcAddress(module, "SymGetModuleBase64");
#endif
_SymGetModuleBase = (SYMGETMODULEBASEPROC)GetProcAddress(module, "SymGetModuleBase");
if (!_SymGetModuleBase64 && !_SymGetModuleBase) return PR_FALSE;
_SymGetSymFromAddr = (SYMGETSYMFROMADDRPROC)GetProcAddress(module, "SymGetSymFromAddr");
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_SymFromAddr = (SYMFROMADDRPROC)GetProcAddress(module, "SymFromAddr");
#endif
if (!_SymFromAddr && !_SymGetSymFromAddr) return PR_FALSE;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_SymLoadModule64 = (SYMLOADMODULE64)GetProcAddress(module, "SymLoadModule64");
#endif
_SymLoadModule = (SYMLOADMODULE)GetProcAddress(module, "SymLoadModule");
@ -209,19 +209,19 @@ EnsureImageHlpInitialized()
_SymUnDName = (SYMUNDNAME)GetProcAddress(module, "SymUnDName");
if (!_SymUnDName) return PR_FALSE;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_SymGetModuleInfo64 = (SYMGETMODULEINFO64)GetProcAddress(module, "SymGetModuleInfo64");
#endif
_SymGetModuleInfo = (SYMGETMODULEINFO)GetProcAddress(module, "SymGetModuleInfo");
if (!_SymGetModuleInfo64 && !_SymGetModuleInfo) return PR_FALSE;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_EnumerateLoadedModules64 = (ENUMLOADEDMODULES64)GetProcAddress(module, "EnumerateLoadedModules64");
#endif
_EnumerateLoadedModules = (ENUMLOADEDMODULES)GetProcAddress(module, "EnumerateLoadedModules");
if (!_EnumerateLoadedModules64 && !_EnumerateLoadedModules) return PR_FALSE;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
_SymGetLineFromAddr64 = (SYMGETLINEFROMADDRPROC64)GetProcAddress(module, "SymGetLineFromAddr64");
#endif
_SymGetLineFromAddr = (SYMGETLINEFROMADDRPROC)GetProcAddress(module, "SymGetLineFromAddr");
@ -266,7 +266,7 @@ static BOOL CALLBACK callbackEspecial64(
ULONG aModuleSize,
PVOID aUserContext)
{
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
BOOL retval = TRUE;
DWORD64 addr = *(DWORD64*)aUserContext;
@ -351,7 +351,7 @@ BOOL SymGetModuleInfoEspecial(HANDLE aProcess, DWORD aAddr, PIMAGEHLP_MODULE aMo
return retval;
}
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
BOOL SymGetModuleInfoEspecial64(HANDLE aProcess, DWORD64 aAddr, PIMAGEHLP_MODULE64 aModuleInfo, PIMAGEHLP_LINE64 aLineInfo)
{
BOOL retval = FALSE;
@ -459,10 +459,16 @@ DumpStackToFile(FILE* aStream)
data.thread = myThread;
data.process = myProcess;
walkerThread = ::CreateThread( NULL, 0, DumpStackToFileThread, (LPVOID) &data, 0, NULL ) ;
walkerReturn = ::WaitForSingleObject(walkerThread, INFINITE);
CloseHandle(myThread) ;
if (walkerReturn != WAIT_OBJECT_0)
PrintError("ThreadWait", aStream);
if (walkerThread) {
walkerReturn = ::WaitForSingleObject(walkerThread, 2000); // no timeout is never a good idea
CloseHandle(myThread) ;
if (walkerReturn != WAIT_OBJECT_0) {
PrintError("ThreadWait", aStream);
}
}
else {
PrintError("ThreadCreate", aStream);
}
return;
}
@ -495,7 +501,7 @@ DumpStackToFileThread(LPVOID lpdata)
void
DumpStackToFileMain64(struct DumpStackToFileData* data)
{
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
// Get the context information for the thread. That way we will
// know where our sp, fp, pc, etc. are and can fill in the
// STACKFRAME64 with the initial values.
@ -708,7 +714,7 @@ DumpStackToFileMain(struct DumpStackToFileData* data)
BOOL modInfoRes;
modInfoRes = SymGetModuleInfoEspecial(myProcess, addr, &modInfo, nsnull);
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
MAX_SYM_NAME*sizeof(TCHAR) + sizeof(ULONG64) - 1) / sizeof(ULONG64)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
@ -716,6 +722,8 @@ DumpStackToFileMain(struct DumpStackToFileData* data)
pSymbol->MaxNameLen = MAX_SYM_NAME;
DWORD64 displacement;
ok = _SymFromAddr && _SymFromAddr(myProcess, addr, &displacement, pSymbol);
#else
char buf[sizeof(IMAGEHLP_SYMBOL) + 512];
PIMAGEHLP_SYMBOL pSymbol = (PIMAGEHLP_SYMBOL) buf;
@ -723,19 +731,12 @@ DumpStackToFileMain(struct DumpStackToFileData* data)
pSymbol->MaxNameLength = 512;
DWORD displacement;
#endif
#ifdef _IMAGEHLP64
ok = _SymFromAddr && _SymFromAddr(myProcess, addr, &displacement, pSymbol);
ok = _SymGetSymFromAddr(myProcess,
frame.AddrPC.Offset,
&displacement,
pSymbol);
#endif
if (!ok)
{
ok = _SymGetSymFromAddr(myProcess,
frame.AddrPC.Offset,
&displacement,
pSymbol);
}
// All done with debug calls so release our lock.
ReleaseMutex(hStackWalkMutex);
@ -759,4 +760,3 @@ DumpStackToFileMain(struct DumpStackToFileData* data)
return;
}

Просмотреть файл

@ -47,6 +47,12 @@
#include <windows.h>
#ifdef _M_IX86
#include <imagehlp.h>
// We need a way to know if we are building for WXP (or later), as if we are, we
// need to use the newer 64-bit APIs. API_VERSION_NUMBER seems to fit the bill.
// A value of 9 indicates we want to use the new APIs.
#if API_VERSION_NUMBER >= 9
#define USING_WXP_VERSION 1
#endif
#endif
// Define these as static pointers so that we can load the DLL on the
@ -77,7 +83,7 @@ typedef BOOL (__stdcall *STACKWALKPROC)(DWORD,
PTRANSLATE_ADDRESS_ROUTINE);
extern STACKWALKPROC _StackWalk;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef BOOL (__stdcall *STACKWALKPROC64)(DWORD,
HANDLE,
HANDLE,
@ -93,7 +99,7 @@ extern STACKWALKPROC64 _StackWalk64;
typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESSPROC)(HANDLE, DWORD);
extern SYMFUNCTIONTABLEACCESSPROC _SymFunctionTableAccess;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESSPROC64)(HANDLE, DWORD64);
extern SYMFUNCTIONTABLEACCESSPROC64 _SymFunctionTableAccess64;
#endif
@ -101,7 +107,7 @@ extern SYMFUNCTIONTABLEACCESSPROC64 _SymFunctionTableAccess64;
typedef DWORD (__stdcall *SYMGETMODULEBASEPROC)(HANDLE, DWORD);
extern SYMGETMODULEBASEPROC _SymGetModuleBase;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef DWORD64 (__stdcall *SYMGETMODULEBASEPROC64)(HANDLE, DWORD64);
extern SYMGETMODULEBASEPROC64 _SymGetModuleBase64;
#endif
@ -109,7 +115,7 @@ extern SYMGETMODULEBASEPROC64 _SymGetModuleBase64;
typedef BOOL (__stdcall *SYMGETSYMFROMADDRPROC)(HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL);
extern SYMGETSYMFROMADDRPROC _SymGetSymFromAddr;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef BOOL (__stdcall *SYMFROMADDRPROC)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO);
extern SYMFROMADDRPROC _SymFromAddr;
#endif
@ -117,7 +123,7 @@ extern SYMFROMADDRPROC _SymFromAddr;
typedef DWORD ( __stdcall *SYMLOADMODULE)(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD);
extern SYMLOADMODULE _SymLoadModule;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef DWORD ( __stdcall *SYMLOADMODULE64)(HANDLE, HANDLE, PCSTR, PCSTR, DWORD64, DWORD);
extern SYMLOADMODULE64 _SymLoadModule64;
#endif
@ -128,7 +134,7 @@ extern SYMUNDNAME _SymUnDName;
typedef DWORD ( __stdcall *SYMGETMODULEINFO)( HANDLE, DWORD, PIMAGEHLP_MODULE);
extern SYMGETMODULEINFO _SymGetModuleInfo;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef BOOL ( __stdcall *SYMGETMODULEINFO64)( HANDLE, DWORD64, PIMAGEHLP_MODULE64);
extern SYMGETMODULEINFO64 _SymGetModuleInfo64;
#endif
@ -136,7 +142,7 @@ extern SYMGETMODULEINFO64 _SymGetModuleInfo64;
typedef BOOL ( __stdcall *ENUMLOADEDMODULES)( HANDLE, PENUMLOADED_MODULES_CALLBACK, PVOID);
extern ENUMLOADEDMODULES _EnumerateLoadedModules;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef BOOL ( __stdcall *ENUMLOADEDMODULES64)( HANDLE, PENUMLOADED_MODULES_CALLBACK64, PVOID);
extern ENUMLOADEDMODULES64 _EnumerateLoadedModules64;
#endif
@ -144,7 +150,7 @@ extern ENUMLOADEDMODULES64 _EnumerateLoadedModules64;
typedef BOOL (__stdcall *SYMGETLINEFROMADDRPROC)(HANDLE, DWORD, PDWORD, PIMAGEHLP_LINE);
extern SYMGETLINEFROMADDRPROC _SymGetLineFromAddr;
#ifdef _IMAGEHLP64
#ifdef USING_WXP_VERSION
typedef BOOL (__stdcall *SYMGETLINEFROMADDRPROC64)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64);
extern SYMGETLINEFROMADDRPROC64 _SymGetLineFromAddr64;
#endif
@ -189,5 +195,3 @@ PR_END_EXTERN_C
#endif //WIN32
#endif //nsStackFrameWin_h___