From 7bfb48d6abb248d9739281ae46f8e9f52fcd16e3 Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 20 Dec 2014 14:45:08 +0100 Subject: cleanup --- src/shared/leaktrace.cpp | 78 ++---------------------------------------------- 1 file changed, 2 insertions(+), 76 deletions(-) (limited to 'src/shared/leaktrace.cpp') diff --git a/src/shared/leaktrace.cpp b/src/shared/leaktrace.cpp index 729eb42e..0d99b82e 100644 --- a/src/shared/leaktrace.cpp +++ b/src/shared/leaktrace.cpp @@ -1,4 +1,5 @@ #include "leaktrace.h" +#include "stackdata.h" #include #include #include @@ -8,82 +9,7 @@ #include -static const int FRAMES_TO_SKIP = 3; // StackData::StackData(), __TraceData::regTrace(), TraceAlloc() -static const int FRAMES_TO_CAPTURE = 10; - - -void initDbgIfNecessary() -{ - HANDLE process = ::GetCurrentProcess(); - static std::set initialized; - if (initialized.find(::GetCurrentProcessId()) == initialized.end()) { - static bool firstCall = true; - if (firstCall) { - ::SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS); - firstCall = false; - } - if (!::SymInitialize(process, NULL, TRUE)) { - printf("failed to initialize symbols: %d", ::GetLastError()); - } - initialized.insert(::GetCurrentProcessId()); - } -} - - -class StackData { - friend bool operator==(const StackData &LHS, const StackData &RHS); - friend bool operator<(const StackData &LHS, const StackData &RHS); -public: - - StackData() - : m_Count(0), m_Hash(0UL), m_FunctionName("Dummy"), m_CodeLine(0) - {} - StackData(const char *functionName, int line) { - m_Count = ::CaptureStackBackTrace(FRAMES_TO_SKIP, FRAMES_TO_CAPTURE, m_Stack, &m_Hash); - m_FunctionName = functionName; - m_CodeLine = line; - if (m_Count == 0) { - // TODO in this case the hash doesn't seem to be set. This is of course not a good solution - m_Hash = reinterpret_cast(m_FunctionName) + m_CodeLine; - } - } - std::string toString() const { - initDbgIfNecessary(); - - char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; - PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer; - symbol->SizeOfStruct = sizeof(SYMBOL_INFO); - symbol->MaxNameLen = MAX_SYM_NAME; - - std::ostringstream stackStream; - - stackStream << m_FunctionName << " [" << m_CodeLine << "]\n"; - - for(unsigned int i = 0; i < m_Count; ++i) { - DWORD64 displacement = 0; - if (!::SymFromAddr(::GetCurrentProcess(), (DWORD64)m_Stack[i], &displacement, symbol)) { - stackStream << m_Count - i - 1 << ": [" << m_Stack[i] << "]\n"; - } else { - stackStream << m_Count - i - 1 << ": " << symbol->Name << "\n"; - } - } - return stackStream.str(); - } -private: - LPVOID m_Stack[FRAMES_TO_CAPTURE]; - USHORT m_Count; - ULONG m_Hash; - const char *m_FunctionName; - int m_CodeLine; -}; - -bool operator==(const StackData &LHS, const StackData &RHS) { - return LHS.m_Hash == RHS.m_Hash; -} - -bool operator<(const StackData &LHS, const StackData &RHS) { - return LHS.m_Hash < RHS.m_Hash; -} +using namespace MOShared; static struct __TraceData { -- cgit v1.3.1