diff --git a/mozilla/xpcom/base/nsStackFrameWin.cpp b/mozilla/xpcom/base/nsStackFrameWin.cpp index 7ff36d4e0df..faeba0735af 100644 --- a/mozilla/xpcom/base/nsStackFrameWin.cpp +++ b/mozilla/xpcom/base/nsStackFrameWin.cpp @@ -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; } - diff --git a/mozilla/xpcom/base/nsStackFrameWin.h b/mozilla/xpcom/base/nsStackFrameWin.h index f60bb083533..b755b8151d2 100644 --- a/mozilla/xpcom/base/nsStackFrameWin.h +++ b/mozilla/xpcom/base/nsStackFrameWin.h @@ -47,6 +47,12 @@ #include #ifdef _M_IX86 #include +// 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___ - -