зеркало из https://github.com/mozilla/pjs.git
Bug 297723 stackwalk code not working for WinXP
patch by colin@theblakes.com r=dougt a=asa
This commit is contained in:
Родитель
6258c1f8e0
Коммит
95f11aa792
|
@ -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___
|
||||
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче