diff options
Diffstat (limited to 'indra/llcommon/StackWalker.cpp')
| -rw-r--r-- | indra/llcommon/StackWalker.cpp | 140 | 
1 files changed, 70 insertions, 70 deletions
| diff --git a/indra/llcommon/StackWalker.cpp b/indra/llcommon/StackWalker.cpp index 201eeed56b..2c1bc47d0e 100644 --- a/indra/llcommon/StackWalker.cpp +++ b/indra/llcommon/StackWalker.cpp @@ -1,5 +1,5 @@  /********************************************************************** - * + *    * StackWalker.cpp   * http://stackwalker.codeplex.com/   * @@ -13,14 +13,14 @@   *                       http://www.codeproject.com/threads/StackWalker.asp   *  2005-07-28   v2    - Changed the params of the constructor and ShowCallstack   *                       (to simplify the usage) - *  2005-08-01   v3    - Changed to use 'CONTEXT_FULL' instead of CONTEXT_ALL + *  2005-08-01   v3    - Changed to use 'CONTEXT_FULL' instead of CONTEXT_ALL    *                       (should also be enough)   *                     - Changed to compile correctly with the PSDK of VC7.0   *                       (GetFileVersionInfoSizeA and GetFileVersionInfoA is wrongly defined:   *                        it uses LPSTR instead of LPCSTR as first paremeter)   *                     - Added declarations to support VC5/6 without using 'dbghelp.h' - *                     - Added a 'pUserData' member to the ShowCallstack function and the - *                       PReadProcessMemoryRoutine declaration (to pass some user-defined data, + *                     - Added a 'pUserData' member to the ShowCallstack function and the  + *                       PReadProcessMemoryRoutine declaration (to pass some user-defined data,    *                       which can be used in the readMemoryFunction-callback)   *  2005-08-02   v4    - OnSymInit now also outputs the OS-Version by default   *                     - Added example for doing an exception-callstack-walking in main.cpp @@ -60,26 +60,26 @@   *   Copyright (c) 2005-2013, Jochen Kalmbach   *   All rights reserved.   * - *   Redistribution and use in source and binary forms, with or without modification, + *   Redistribution and use in source and binary forms, with or without modification,    *   are permitted provided that the following conditions are met:   * - *   Redistributions of source code must retain the above copyright notice, - *   this list of conditions and the following disclaimer. - *   Redistributions in binary form must reproduce the above copyright notice, - *   this list of conditions and the following disclaimer in the documentation - *   and/or other materials provided with the distribution. - *   Neither the name of Jochen Kalmbach nor the names of its contributors may be - *   used to endorse or promote products derived from this software without - *   specific prior written permission. - *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - *   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - *   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - *   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - *   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - *   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - *   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - *   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + *   Redistributions of source code must retain the above copyright notice,  + *   this list of conditions and the following disclaimer.  + *   Redistributions in binary form must reproduce the above copyright notice,  + *   this list of conditions and the following disclaimer in the documentation  + *   and/or other materials provided with the distribution.  + *   Neither the name of Jochen Kalmbach nor the names of its contributors may be  + *   used to endorse or promote products derived from this software without  + *   specific prior written permission.  + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  + *   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  + *   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  + *   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE  + *   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES  + *   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  + *   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND  + *   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS    *   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   *   **********************************************************************/ @@ -234,7 +234,7 @@ DWORD64  // Some missing defines (for VC5/6):  #ifndef INVALID_FILE_ATTRIBUTES  #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) -#endif +#endif    // secure-CRT_functions are only available starting with VC8 @@ -292,10 +292,10 @@ public:        free(m_szSymPath);      m_szSymPath = NULL;    } -  BOOL Init(LPCSTR szSymPath) +  bool Init(LPCSTR szSymPath)    {      if (m_parent == NULL) -      return FALSE; +      return false;      // Dynamically load the Entry-Points for dbghelp.dll:      // First try to load the newsest one from      TCHAR szTemp[4096]; @@ -364,7 +364,7 @@ public:      if (m_hDbhHelp == NULL)  // if not already loaded, try to load a default-one        m_hDbhHelp = LoadLibrary( _T("dbghelp.dll") );      if (m_hDbhHelp == NULL) -      return FALSE; +      return false;      pSI = (tSI) GetProcAddress(m_hDbhHelp, "SymInitialize" );      pSC = (tSC) GetProcAddress(m_hDbhHelp, "SymCleanup" ); @@ -388,7 +388,7 @@ public:        FreeLibrary(m_hDbhHelp);        m_hDbhHelp = NULL;        pSC = NULL; -      return FALSE; +      return false;      }      // SymInitialize @@ -396,7 +396,7 @@ public:        m_szSymPath = _strdup(szSymPath);      if (this->pSI(m_hProcess, m_szSymPath, FALSE) == FALSE)        this->m_parent->OnDbgHelpErr("SymInitialize", GetLastError(), 0); - +            DWORD symOptions = this->pSGO();  // SymGetOptions      symOptions |= SYMOPT_LOAD_LINES;      symOptions |= SYMOPT_FAIL_CRITICAL_ERRORS; @@ -415,7 +415,7 @@ public:      GetUserNameA(szUserName, &dwSize);      this->m_parent->OnSymInit(buf, symOptions, szUserName); -    return TRUE; +    return true;    }    StackWalker *m_parent; @@ -512,11 +512,11 @@ struct IMAGEHLP_MODULE64_V2 {    tSSO pSSO;    // StackWalk64() -  typedef BOOL (__stdcall *tSW)( -    DWORD MachineType, +  typedef BOOL (__stdcall *tSW)(  +    DWORD MachineType,       HANDLE hProcess, -    HANDLE hThread, -    LPSTACKFRAME64 StackFrame, +    HANDLE hThread,  +    LPSTACKFRAME64 StackFrame,       PVOID ContextRecord,      PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,      PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, @@ -555,7 +555,7 @@ private:    typedef MODULEENTRY32 *  LPMODULEENTRY32;    #pragma pack( pop ) -  BOOL GetModuleListTH32(HANDLE hProcess, DWORD pid) +  bool GetModuleListTH32(HANDLE hProcess, DWORD pid)    {      // CreateToolhelp32Snapshot()      typedef HANDLE (__stdcall *tCT32S)(DWORD dwFlags, DWORD th32ProcessID); @@ -592,13 +592,13 @@ private:      }      if (hToolhelp == NULL) -      return FALSE; +      return false;      hSnap = pCT32S( TH32CS_SNAPMODULE, pid );      if (hSnap == (HANDLE) -1)      {        FreeLibrary(hToolhelp); -      return FALSE; +      return false;      }      keepGoing = !!pM32F( hSnap, &me ); @@ -612,8 +612,8 @@ private:      CloseHandle(hSnap);      FreeLibrary(hToolhelp);      if (cnt <= 0) -      return FALSE; -    return TRUE; +      return false; +    return true;    }  // GetModuleListTH32    // **************************************** PSAPI ************************ @@ -623,7 +623,7 @@ private:        LPVOID EntryPoint;    } MODULEINFO, *LPMODULEINFO; -  BOOL GetModuleListPSAPI(HANDLE hProcess) +  bool GetModuleListPSAPI(HANDLE hProcess)    {      // EnumProcessModules()      typedef BOOL (__stdcall *tEPM)(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded ); @@ -652,7 +652,7 @@ private:      hPsapi = LoadLibrary( _T("psapi.dll") );      if (hPsapi == NULL) -      return FALSE; +      return false;      pEPM = (tEPM) GetProcAddress( hPsapi, "EnumProcessModules" );      pGMFNE = (tGMFNE) GetProcAddress( hPsapi, "GetModuleFileNameExA" ); @@ -662,7 +662,7 @@ private:      {        // we couldn't find all functions        FreeLibrary(hPsapi); -      return FALSE; +      return false;      }      hMods = (HMODULE*) malloc(sizeof(HMODULE) * (TTBUFLEN / sizeof(HMODULE))); @@ -797,7 +797,7 @@ private:      return result;    }  public: -  BOOL LoadModules(HANDLE hProcess, DWORD dwProcessId) +  bool LoadModules(HANDLE hProcess, DWORD dwProcessId)    {      // first try toolhelp32      if (GetModuleListTH32(hProcess, dwProcessId)) @@ -807,13 +807,13 @@ public:    } -  BOOL GetModuleInfo(HANDLE hProcess, DWORD64 baseAddr, IMAGEHLP_MODULE64_V3 *pModuleInfo) +  bool GetModuleInfo(HANDLE hProcess, DWORD64 baseAddr, IMAGEHLP_MODULE64_V3 *pModuleInfo)    {      memset(pModuleInfo, 0, sizeof(IMAGEHLP_MODULE64_V3));      if(this->pSGMI == NULL)      {        SetLastError(ERROR_DLL_INIT_FAILED); -      return FALSE; +      return false;      }      // First try to use the larger ModuleInfo-Structure      pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3); @@ -821,7 +821,7 @@ public:      if (pData == NULL)      {        SetLastError(ERROR_NOT_ENOUGH_MEMORY); -      return FALSE; +      return false;      }      memcpy(pData, pModuleInfo, sizeof(IMAGEHLP_MODULE64_V3));      static bool s_useV3Version = true; @@ -833,7 +833,7 @@ public:          memcpy(pModuleInfo, pData, sizeof(IMAGEHLP_MODULE64_V3));          pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3);          free(pData); -        return TRUE; +        return true;        }        s_useV3Version = false;  // to prevent unneccessarry calls with the larger struct...      } @@ -847,11 +847,11 @@ public:        memcpy(pModuleInfo, pData, sizeof(IMAGEHLP_MODULE64_V2));        pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2);        free(pData); -      return TRUE; +      return true;      }      free(pData);      SetLastError(ERROR_DLL_INIT_FAILED); -    return FALSE; +    return false;    }  }; @@ -860,7 +860,7 @@ StackWalker::StackWalker(DWORD dwProcessId, HANDLE hProcess)  {    this->m_verbose = true;    this->m_options = OptionsAll; -  this->m_modulesLoaded = FALSE; +  this->m_modulesLoaded = false;    this->m_hProcess = hProcess;    this->m_sw = new StackWalkerInternal(this, this->m_hProcess);    this->m_dwProcessId = dwProcessId; @@ -871,7 +871,7 @@ StackWalker::StackWalker(bool verbose, int options, LPCSTR szSymPath, DWORD dwPr  {    this->m_verbose = verbose;    this->m_options = options; -  this->m_modulesLoaded = FALSE; +  this->m_modulesLoaded = false;    this->m_hProcess = hProcess;    this->m_sw = new StackWalkerInternal(this, this->m_hProcess);    this->m_dwProcessId = dwProcessId; @@ -895,15 +895,15 @@ StackWalker::~StackWalker()    this->m_sw = NULL;  } -BOOL StackWalker::LoadModules() +bool StackWalker::LoadModules()  {    if (this->m_sw == NULL)    {      SetLastError(ERROR_DLL_INIT_FAILED); -    return FALSE; +    return false;    }    if (m_modulesLoaded != FALSE) -    return TRUE; +    return true;    // Build the sym-path:    char *szSymPath = NULL; @@ -914,7 +914,7 @@ BOOL StackWalker::LoadModules()      if (szSymPath == NULL)      {        SetLastError(ERROR_NOT_ENOUGH_MEMORY); -      return FALSE; +      return false;      }      szSymPath[0] = 0;      // Now first add the (optional) provided sympath: @@ -994,30 +994,30 @@ BOOL StackWalker::LoadModules()    }  // if SymBuildPath    // First Init the whole stuff... -  BOOL bRet = this->m_sw->Init(szSymPath); +  bool bRet = this->m_sw->Init(szSymPath);    if (szSymPath != NULL) free(szSymPath); szSymPath = NULL; -  if (bRet == FALSE) +  if (!bRet)    {      this->OnDbgHelpErr("Error while initializing dbghelp.dll", 0, 0);      SetLastError(ERROR_DLL_INIT_FAILED); -    return FALSE; +    return false;    }    bRet = this->m_sw->LoadModules(this->m_hProcess, this->m_dwProcessId); -  if (bRet != FALSE) -    m_modulesLoaded = TRUE; +  if (bRet) +    m_modulesLoaded = true;    return bRet;  }  // The following is used to pass the "userData"-Pointer to the user-provided readMemoryFunction  // This has to be done due to a problem with the "hProcess"-parameter in x64... -// Because this class is in no case multi-threading-enabled (because of the limitations +// Because this class is in no case multi-threading-enabled (because of the limitations   // of dbghelp.dll) it is "safe" to use a static-variable  static StackWalker::PReadProcessMemoryRoutine s_readMemoryFunction = NULL;  static LPVOID s_readMemoryFunction_UserData = NULL; -BOOL StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *context, PReadProcessMemoryRoutine readMemoryFunction, LPVOID pUserData) +bool StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *context, PReadProcessMemoryRoutine readMemoryFunction, LPVOID pUserData)  {    m_verbose = verbose;    CONTEXT c; @@ -1029,13 +1029,13 @@ BOOL StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *con    bool bLastEntryCalled = true;    int curRecursionCount = 0; -  if (m_modulesLoaded == FALSE) +  if (!m_modulesLoaded)      this->LoadModules();  // ignore the result...    if (this->m_sw->m_hDbhHelp == NULL)    {      SetLastError(ERROR_DLL_INIT_FAILED); -    return FALSE; +    return false;    }    s_readMemoryFunction = readMemoryFunction; @@ -1062,7 +1062,7 @@ BOOL StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *con        if (GetThreadContext(hThread, &c) == FALSE)        {          ResumeThread(hThread); -        return FALSE; +        return false;        }      }    } @@ -1222,7 +1222,7 @@ BOOL StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *con                    csEntry.symTypeString = NULL;                    break;                } - +                        MyStrCpy(csEntry.moduleName, STACKWALK_MAX_NAMELEN, Module.ModuleName);                csEntry.baseOfImage = Module.BaseOfImage;                MyStrCpy(csEntry.loadedImageName, STACKWALK_MAX_NAMELEN, Module.LoadedImageName); @@ -1243,7 +1243,7 @@ BOOL StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *con        et = firstEntry;      bLastEntryCalled = false;      this->OnCallstackEntry(et, csEntry); - +          if (s.AddrReturn.Offset == 0)      {        bLastEntryCalled = true; @@ -1256,13 +1256,13 @@ BOOL StackWalker::ShowCallstack(bool verbose, HANDLE hThread, const CONTEXT *con    cleanup:      if (pSym) free( pSym ); -  if (bLastEntryCalled == false) +  if (!bLastEntryCalled)        this->OnCallstackEntry(lastEntry, csEntry);    if (context == NULL)      ResumeThread(hThread); -  return TRUE; +  return true;  }  BOOL __stdcall StackWalker::myReadProcMem( @@ -1358,7 +1358,7 @@ void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUser    ver.dwOSVersionInfoSize = sizeof(ver);    if (GetVersionExA(&ver) != FALSE)    { -    _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "OS-Version: %d.%d.%d (%s)\n", +    _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "OS-Version: %d.%d.%d (%s)\n",         ver.dwMajorVersion, ver.dwMinorVersion, ver.dwBuildNumber,        ver.szCSDVersion);      if (m_verbose) @@ -1372,7 +1372,7 @@ void StackWalker::OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUser    ver.dwOSVersionInfoSize = sizeof(ver);    if (GetVersionExA( (OSVERSIONINFOA*) &ver) != FALSE)    { -    _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n", +    _snprintf_s(buffer, STACKWALK_MAX_NAMELEN, "OS-Version: %d.%d.%d (%s) 0x%x-0x%x\n",         ver.dwMajorVersion, ver.dwMinorVersion, ver.dwBuildNumber,        ver.szCSDVersion, ver.wSuiteMask, ver.wProductType);      if (m_verbose) | 
