[Opalvoip-svn] SF.net SVN: opalvoip:[32660] ptlib/branches/v2_14/src/ptlib
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2014-09-02 00:56:10
|
Revision: 32660 http://sourceforge.net/p/opalvoip/code/32660 Author: rjongbloed Date: 2014-09-02 00:56:07 +0000 (Tue, 02 Sep 2014) Log Message: ----------- First element of stack walk is always InternalStackWalk, so don't display it. Some code tidying. Modified Paths: -------------- ptlib/branches/v2_14/src/ptlib/msos/assert.cxx ptlib/branches/v2_14/src/ptlib/unix/assert.cxx Modified: ptlib/branches/v2_14/src/ptlib/msos/assert.cxx =================================================================== --- ptlib/branches/v2_14/src/ptlib/msos/assert.cxx 2014-09-01 10:16:41 UTC (rev 32659) +++ ptlib/branches/v2_14/src/ptlib/msos/assert.cxx 2014-09-02 00:56:07 UTC (rev 32660) @@ -42,275 +42,266 @@ #ifdef _WIN32_WCE -void PProcess::WaitOnExitConsoleWindow() -{ -} + void PProcess::WaitOnExitConsoleWindow() + { + } -#define InternalStackWalk(strm, id) + #define InternalStackWalk(strm, id) -#elif defined(__MINGW32__) + #elif defined(__MINGW32__) -void PProcess::WaitOnExitConsoleWindow() -{ -} + void PProcess::WaitOnExitConsoleWindow() + { + } -#define InternalStackWalk(strm, id) + #define InternalStackWalk(strm, id) + #if PTRACING + void PTrace::WalkStack(ostream &, PThreadIdentifier) + { + } + #endif // PTRACING + #else -static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM thisProcess) -{ - char wndClassName[100]; - GetClassName(hWnd, wndClassName, sizeof(wndClassName)); - if (strcmp(wndClassName, "ConsoleWindowClass") != 0) - return true; + static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM thisProcess) + { + char wndClassName[100]; + GetClassName(hWnd, wndClassName, sizeof(wndClassName)); + if (strcmp(wndClassName, "ConsoleWindowClass") != 0) + return true; - DWORD wndProcess; - GetWindowThreadProcessId(hWnd, &wndProcess); - if (wndProcess != (DWORD)thisProcess) - return true; + DWORD wndProcess; + GetWindowThreadProcessId(hWnd, &wndProcess); + if (wndProcess != (DWORD)thisProcess) + return true; - PTRACE(4, "PTLib\tAwaiting key press on exit."); - cerr << "\nPress a key to exit . . ."; - cerr.flush(); + PTRACE(4, "PTLib\tAwaiting key press on exit."); + cerr << "\nPress a key to exit . . ."; + cerr.flush(); - HANDLE in = GetStdHandle(STD_INPUT_HANDLE); - SetConsoleMode(in, ENABLE_PROCESSED_INPUT); - FlushConsoleInputBuffer(in); - char dummy; - DWORD readBytes; - ReadConsole(in, &dummy, 1, &readBytes, NULL); - return false; -} + HANDLE in = GetStdHandle(STD_INPUT_HANDLE); + SetConsoleMode(in, ENABLE_PROCESSED_INPUT); + FlushConsoleInputBuffer(in); + char dummy; + DWORD readBytes; + ReadConsole(in, &dummy, 1, &readBytes, NULL); + return false; + } -void PProcess::WaitOnExitConsoleWindow() -{ - if (m_waitOnExitConsoleWindow && !m_library) - EnumWindows(EnumWindowsProc, GetCurrentProcessId()); -} + void PProcess::WaitOnExitConsoleWindow() + { + if (m_waitOnExitConsoleWindow && !m_library) + EnumWindows(EnumWindowsProc, GetCurrentProcessId()); + } -#include <DbgHelp.h> + #include <DbgHelp.h> -#if defined (_M_IX86) -#define IMAGE_FILE_MACHINE IMAGE_FILE_MACHINE_I386 -#elif _M_X64 -#define IMAGE_FILE_MACHINE IMAGE_FILE_MACHINE_AMD64 -#elif _M_IA64 -#define IMAGE_FILE_MACHINE IMAGE_FILE_MACHINE_IA64 -#else -#error ( "Unknown machine!" ) -#endif + class PDebugDLL : public PDynaLink + { + PCLASSINFO(PDebugDLL, PDynaLink) + public: + BOOL (__stdcall *m_SymInitialize)( + __in HANDLE hProcess, + __in_opt PCSTR UserSearchPath, + __in BOOL fInvadeProcess + ); + BOOL (__stdcall *m_SymCleanup)( + __in HANDLE hProcess + ); + DWORD (__stdcall *m_SymGetOptions)( + VOID + ); + DWORD (__stdcall *m_SymSetOptions)( + __in DWORD SymOptions + ); + BOOL (__stdcall *m_StackWalk64)( + __in DWORD MachineType, + __in HANDLE hProcess, + __in HANDLE hThread, + __inout LPSTACKFRAME64 StackFrame, + __inout PVOID ContextRecord, + __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, + __in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + __in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress + ); + BOOL (__stdcall *m_SymGetSymFromAddr64)( + __in HANDLE hProcess, + __in DWORD64 qwAddr, + __out_opt PDWORD64 pdwDisplacement, + __inout PIMAGEHLP_SYMBOL64 Symbol + ); -class PDebugDLL : public PDynaLink -{ - PCLASSINFO(PDebugDLL, PDynaLink) - public: - BOOL (__stdcall *m_SymInitialize)( - __in HANDLE hProcess, - __in_opt PCSTR UserSearchPath, - __in BOOL fInvadeProcess - ); - BOOL (__stdcall *m_SymCleanup)( - __in HANDLE hProcess - ); - DWORD (__stdcall *m_SymGetOptions)( - VOID - ); - DWORD (__stdcall *m_SymSetOptions)( - __in DWORD SymOptions - ); - BOOL (__stdcall *m_StackWalk64)( - __in DWORD MachineType, - __in HANDLE hProcess, - __in HANDLE hThread, - __inout LPSTACKFRAME64 StackFrame, - __inout PVOID ContextRecord, - __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, - __in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - __in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress - ); - BOOL (__stdcall *m_SymGetSymFromAddr64)( - __in HANDLE hProcess, - __in DWORD64 qwAddr, - __out_opt PDWORD64 pdwDisplacement, - __inout PIMAGEHLP_SYMBOL64 Symbol - ); + PFUNCTION_TABLE_ACCESS_ROUTINE64 m_SymFunctionTableAccess64; + PGET_MODULE_BASE_ROUTINE64 m_SymGetModuleBase64; - PFUNCTION_TABLE_ACCESS_ROUTINE64 m_SymFunctionTableAccess64; - PGET_MODULE_BASE_ROUTINE64 m_SymGetModuleBase64; + PDebugDLL() + : PDynaLink("DBGHELP.DLL") + { + } - PDebugDLL() - : PDynaLink("DBGHELP.DLL") - { - } + ~PDebugDLL() + { + if (IsLoaded()) + m_SymCleanup(GetCurrentProcess()); + } - ~PDebugDLL() - { - if (IsLoaded()) - m_SymCleanup(GetCurrentProcess()); - } + void StackWalk(ostream & strm, PThreadIdentifier id, unsigned maxWalk) + { + if (!GetFunction("SymInitialize", (Function &)m_SymInitialize) || + !GetFunction("SymCleanup", (Function &)m_SymCleanup) || + !GetFunction("SymGetOptions", (Function &)m_SymGetOptions) || + !GetFunction("SymSetOptions", (Function &)m_SymSetOptions) || + !GetFunction("StackWalk64", (Function &)m_StackWalk64) || + !GetFunction("SymGetSymFromAddr64", (Function &)m_SymGetSymFromAddr64) || + !GetFunction("SymFunctionTableAccess64", (Function &)m_SymFunctionTableAccess64) || + !GetFunction("SymGetModuleBase64", (Function &)m_SymGetModuleBase64) || + !m_SymInitialize(GetCurrentProcess(), NULL, TRUE)) { + DWORD err = ::GetLastError(); + strm << "\n Invalid stack walk DLL: " << GetName() << " failed: error=" << err; + return; + } - void StackWalk(ostream & strm, PThreadIdentifier id) - { - if (!GetFunction("SymInitialize", (Function &)m_SymInitialize) || - !GetFunction("SymCleanup", (Function &)m_SymCleanup) || - !GetFunction("SymGetOptions", (Function &)m_SymGetOptions) || - !GetFunction("SymSetOptions", (Function &)m_SymSetOptions) || - !GetFunction("StackWalk64", (Function &)m_StackWalk64) || - !GetFunction("SymGetSymFromAddr64", (Function &)m_SymGetSymFromAddr64) || - !GetFunction("SymFunctionTableAccess64", (Function &)m_SymFunctionTableAccess64) || - !GetFunction("SymGetModuleBase64", (Function &)m_SymGetModuleBase64) || - !m_SymInitialize(GetCurrentProcess(), NULL, TRUE)) { - DWORD err = ::GetLastError(); - strm << "\n Invalid stack walk DLL: " << GetName() << " failed: error=" << err; - return; - } + m_SymSetOptions(m_SymGetOptions()|SYMOPT_LOAD_LINES|SYMOPT_FAIL_CRITICAL_ERRORS|SYMOPT_NO_PROMPTS); - m_SymSetOptions(m_SymGetOptions()|SYMOPT_LOAD_LINES|SYMOPT_FAIL_CRITICAL_ERRORS|SYMOPT_NO_PROMPTS); + // The thread information. + HANDLE hThread; + unsigned framesToSkip = 0; + int resumeCount = -1; - // The thread information. - HANDLE hThread; - unsigned framesToSkip = 0; - int resumeCount = -1; + CONTEXT threadContext; + memset(&threadContext, 0, sizeof(threadContext)); + threadContext.ContextFlags = CONTEXT_FULL; - CONTEXT threadContext; - memset(&threadContext, 0, sizeof(threadContext)); - threadContext.ContextFlags = CONTEXT_FULL; - - if (id == PNullThreadIdentifier || id == GetCurrentThreadId()) { - hThread = GetCurrentThread(); - RtlCaptureContext(&threadContext); - framesToSkip = 2; - } - else { - hThread = OpenThread(THREAD_QUERY_INFORMATION|THREAD_GET_CONTEXT|THREAD_SUSPEND_RESUME, FALSE, id); - if (hThread == NULL) { - DWORD err = ::GetLastError(); - strm << "\n No thread: id=" << id << " (0x" << std::hex << id << std::dec << "), error=" << err; - return; + if (id == PNullThreadIdentifier || id == GetCurrentThreadId()) { + hThread = GetCurrentThread(); + RtlCaptureContext(&threadContext); + framesToSkip = 2; } - resumeCount = SuspendThread(hThread); - if (!GetThreadContext(hThread, &threadContext)) { - if (resumeCount >= 0) - ResumeThread(hThread); - DWORD err = ::GetLastError(); - strm << "\n No context for thread: id=" << id << " (0x" << std::hex << id << std::dec << "), error=" << err; - return; + else { + hThread = OpenThread(THREAD_QUERY_INFORMATION|THREAD_GET_CONTEXT|THREAD_SUSPEND_RESUME, FALSE, id); + if (hThread == NULL) { + DWORD err = ::GetLastError(); + strm << "\n No thread: id=" << id << " (0x" << std::hex << id << std::dec << "), error=" << err; + return; + } + resumeCount = SuspendThread(hThread); + if (!GetThreadContext(hThread, &threadContext)) { + if (resumeCount >= 0) + ResumeThread(hThread); + DWORD err = ::GetLastError(); + strm << "\n No context for thread: id=" << id << " (0x" << std::hex << id << std::dec << "), error=" << err; + return; + } } - } - STACKFRAME64 frame; - memset(&frame, 0, sizeof(frame)); - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrStack.Mode = AddrModeFlat; - frame.AddrFrame.Mode = AddrModeFlat; -#ifdef _M_IX86 - // normally, call ImageNtHeader() and use machine info from PE header - DWORD imageType = IMAGE_FILE_MACHINE_I386; - frame.AddrPC.Offset = threadContext.Eip; - frame.AddrFrame.Offset = frame.AddrStack.Offset = threadContext.Esp; -#elif _M_X64 - DWORD imageType = IMAGE_FILE_MACHINE_AMD64; - frame.AddrPC.Offset = threadContext.Rip; - frame.AddrFrame.Offset = frame.AddrStack.Offset = threadContext.Rsp; -#elif _M_IA64 - DWORD imageType = IMAGE_FILE_MACHINE_IA64; - frame.AddrPC.Offset = threadContext.StIIP; - frame.AddrFrame.Offset = threadContext.IntSp; - frame.AddrBStore.Offset = threadContext.RsBSP; - frame.AddrBStore.Mode = AddrModeFlat; - frame.AddrStack.Offset = threadContext.IntSp; -#else - #error "Platform not supported!" -#endif + STACKFRAME64 frame; + memset(&frame, 0, sizeof(frame)); + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrStack.Mode = AddrModeFlat; + frame.AddrFrame.Mode = AddrModeFlat; + #ifdef _M_IX86 + // normally, call ImageNtHeader() and use machine info from PE header + DWORD imageType = IMAGE_FILE_MACHINE_I386; + frame.AddrPC.Offset = threadContext.Eip; + frame.AddrFrame.Offset = frame.AddrStack.Offset = threadContext.Esp; + #elif _M_X64 + DWORD imageType = IMAGE_FILE_MACHINE_AMD64; + frame.AddrPC.Offset = threadContext.Rip; + frame.AddrFrame.Offset = frame.AddrStack.Offset = threadContext.Rsp; + #elif _M_IA64 + DWORD imageType = IMAGE_FILE_MACHINE_IA64; + frame.AddrPC.Offset = threadContext.StIIP; + frame.AddrFrame.Offset = threadContext.IntSp; + frame.AddrBStore.Offset = threadContext.RsBSP; + frame.AddrBStore.Mode = AddrModeFlat; + frame.AddrStack.Offset = threadContext.IntSp; + #else + #error "Platform not supported!" + #endif - unsigned frameCount = 0; -#if PTRACING - while (frameCount++ < PTrace::MaxStackWalk) { -#else - while (frameCount++ < 20) { -#endif - if (!m_StackWalk64(imageType, - GetCurrentProcess(), - hThread, - &frame, - &threadContext, - NULL, - m_SymFunctionTableAccess64, - m_SymGetModuleBase64, - NULL)) { - DWORD err = ::GetLastError(); - strm << "\n StackWalk64 failed: error=" << err; - break; - } + unsigned frameCount = 0; + while (frameCount++ < maxWalk) { + if (!m_StackWalk64(imageType, + GetCurrentProcess(), + hThread, + &frame, + &threadContext, + NULL, + m_SymFunctionTableAccess64, + m_SymGetModuleBase64, + NULL)) { + DWORD err = ::GetLastError(); + strm << "\n StackWalk64 failed: error=" << err; + break; + } - if (frame.AddrPC.Offset == frame.AddrReturn.Offset) { - strm << "\n StackWalk64 returned recursive stack! PC=0x" << hex << frame.AddrPC.Offset << dec; - break; - } + if (frame.AddrPC.Offset == frame.AddrReturn.Offset) { + strm << "\n StackWalk64 returned recursive stack! PC=0x" << hex << frame.AddrPC.Offset << dec; + break; + } - if (frameCount <= framesToSkip || frame.AddrPC.Offset == 0) - continue; + if (frameCount <= framesToSkip || frame.AddrPC.Offset == 0) + continue; - strm << "\n " << hex << setfill('0'); + strm << "\n " << hex << setfill('0'); - char buffer[sizeof(IMAGEHLP_SYMBOL64)+200]; - PIMAGEHLP_SYMBOL64 symbol = (PIMAGEHLP_SYMBOL64)buffer; - symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); - symbol->MaxNameLength = sizeof(buffer)-sizeof(IMAGEHLP_SYMBOL64); - DWORD64 displacement = 0; - if (m_SymGetSymFromAddr64(GetCurrentProcess(), frame.AddrPC.Offset, &displacement, symbol)) - strm << symbol->Name; - else - strm << setw(8) << frame.AddrPC.Offset; - strm << '('; - for (PINDEX i = 0; i < PARRAYSIZE(frame.Params); i++) { - if (i > 0) - strm << ", "; - if (frame.Params[i] != 0) - strm << "0x"; - strm << frame.Params[i]; + char buffer[sizeof(IMAGEHLP_SYMBOL64)+200]; + PIMAGEHLP_SYMBOL64 symbol = (PIMAGEHLP_SYMBOL64)buffer; + symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); + symbol->MaxNameLength = sizeof(buffer)-sizeof(IMAGEHLP_SYMBOL64); + DWORD64 displacement = 0; + if (m_SymGetSymFromAddr64(GetCurrentProcess(), frame.AddrPC.Offset, &displacement, symbol)) + strm << symbol->Name; + else + strm << setw(8) << frame.AddrPC.Offset; + strm << '('; + for (PINDEX i = 0; i < PARRAYSIZE(frame.Params); i++) { + if (i > 0) + strm << ", "; + if (frame.Params[i] != 0) + strm << "0x"; + strm << frame.Params[i]; + } + strm << setfill(' ') << ')'; + if (displacement != 0) + strm << " + 0x" << displacement; + + strm << dec << setfill(' '); + + if (frame.AddrReturn.Offset == 0) + break; } - strm << setfill(' ') << ')'; - if (displacement != 0) - strm << " + 0x" << displacement; - strm << dec << setfill(' '); - - if (frame.AddrReturn.Offset == 0) - break; + if (resumeCount >= 0) + ResumeThread(hThread); } + }; - if (resumeCount >= 0) - ResumeThread(hThread); - } -}; + static PCriticalSection StackWalkMutex; -static PCriticalSection StackWalkMutex; + #if PTRACING + #define InternalStackWalk PTrace::WalkStack + #define InternalMaxStackWalk PTrace::MaxStackWalk + #else + #define InternalMaxStackWalk 20 + static + #endif // PTRACING + void InternalStackWalk(ostream & strm, PThreadIdentifier id) + { + StackWalkMutex.Wait(); + PDebugDLL debughelp; + if (debughelp.IsLoaded()) + debughelp.StackWalk(strm, id, InternalMaxStackWalk); + StackWalkMutex.Signal(); + } -static void InternalStackWalk(ostream & strm, PThreadIdentifier id) -{ - StackWalkMutex.Wait(); - PDebugDLL debughelp; - if (debughelp.IsLoaded()) - debughelp.StackWalk(strm, id); - StackWalkMutex.Signal(); -} - #endif // _WIN32_WCE -#if PTRACING -void PTrace::WalkStack(ostream & strm, PThreadIdentifier id) -{ - InternalStackWalk(strm, id); -} -#endif // PTRACING - - static PCriticalSection AssertMutex; bool PAssertFunc(const char * msg) Modified: ptlib/branches/v2_14/src/ptlib/unix/assert.cxx =================================================================== --- ptlib/branches/v2_14/src/ptlib/unix/assert.cxx 2014-09-01 10:16:41 UTC (rev 32659) +++ ptlib/branches/v2_14/src/ptlib/unix/assert.cxx 2014-09-02 00:56:07 UTC (rev 32660) @@ -41,11 +41,19 @@ #if P_HAS_BACKTRACE + #include <execinfo.h> #if P_HAS_DEMANGLE #include <cxxabi.h> #endif + #if PTRACING + #define InternalStackWalk PTrace::WalkStack + #define InternalMaxStackWalk PTrace::MaxStackWalk + #else + #define InternalMaxStackWalk 20 + static + #endif // PTRACING void InternalStackWalk(ostream & strm, PThreadIdentifier id) { if (id != PNullThreadIdentifier && id != PThread::GetCurrentThreadId()) { @@ -53,57 +61,57 @@ return; } - void* addresses[PTrace::MaxStackWalk]; - int addressCount = backtrace(addresses, PTrace::MaxStackWalk); + void* addresses[InternalMaxStackWalk]; + int addressCount = backtrace(addresses, InternalMaxStackWalk); if (addressCount == 0) { strm << "\n Stack back trace empty, possibly corrupt\n"; return; } char ** symbols = backtrace_symbols(addresses, addressCount); - for (int i = 0; i < addressCount; ++i) { + for (int i = 1; i < addressCount; ++i) { strm << "\n "; if (symbols[i] == NULL || symbols[i][0] == '\0') { strm << addresses[i]; continue; } -#if P_HAS_DEMANGLE - char * mangled = strchr(symbols[i], '('); - if (mangled != NULL) { - ++mangled; - char * offset = mangled + strcspn(mangled, "+)"); - if (offset != mangled) { - char separator = *offset; - *offset++ = '\0'; + #if P_HAS_DEMANGLE + char * mangled = strchr(symbols[i], '('); + if (mangled != NULL) { + ++mangled; + char * offset = mangled + strcspn(mangled, "+)"); + if (offset != mangled) { + char separator = *offset; + *offset++ = '\0'; - int status = 0; - char name[100]; - size_t size = sizeof(name); - char * ret = abi::__cxa_demangle(mangled, name, &size, &status); - if (status == 0) { - *mangled = '\0'; - strm << symbols[i] << name << separator << offset; - continue; + int status = 0; + char name[100]; + size_t size = sizeof(name); + char * ret = abi::__cxa_demangle(mangled, name, &size, &status); + if (status == 0) { + *mangled = '\0'; + strm << symbols[i] << name << separator << offset; + continue; + } } } - } -#endif // P_HAS_DEMANGLE + #endif // P_HAS_DEMANGLE strm << symbols[i]; } } #else + #define InternalStackWalk(s, i) -#endif // P_HAS_BACKTRACE + #if PTRACING + void PTrace::WalkStack(ostream &, PThreadIdentifier) + { + } + #endif // PTRACING -#if PTRACING -void PTrace::WalkStack(ostream & strm, PThreadIdentifier id) -{ - InternalStackWalk(strm, id); -} -#endif // PTRACING +#endif // P_HAS_BACKTRACE #define OUTPUT_MESSAGE(msg) \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |