diff --git a/Framework/StackTrace.cpp b/Framework/StackTrace.cpp new file mode 100644 index 0000000..82fafcf --- /dev/null +++ b/Framework/StackTrace.cpp @@ -0,0 +1,79 @@ +#include "StackTrace.h" +#include +#include + + +#ifdef _WIN32 + +#include "DbgHelp.h" +#include +#pragma comment(lib, "Dbghelp.lib") + +void PrintStackTrace() +{ + HANDLE process = GetCurrentProcess(); + SymInitialize(process, NULL, TRUE); + void* stack[60]; + unsigned short frames = CaptureStackBackTrace(0, 60, stack, NULL); + SYMBOL_INFO *symbol = (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1); + symbol->MaxNameLen = 255; + symbol->SizeOfStruct = sizeof(SYMBOL_INFO); + for(int i = 0; i < frames; i++) + { + SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); + printf("%i: %016I64LX %s - 0x%0X\n", frames - i - 1, stack[i], symbol->Name, symbol->Address); + } + free(symbol); +} + +#else + +#include +#include +#include + +char* SplitStringNext(char* str, char ch) +{ + if (!str) + return 0; + int i = 0; + while (str[i] && str[i] != ch) + i++; + if (!str[i]) + return 0; + str[i] = 0; + return &str[i + 1]; +} + +void PrintStackTrace() +{ +#ifdef USE_PSTACK + if (FILE* f = popen(std::string("pstack " + std::to_string(getpid()) + " | c++filt").c_str(), "r")) + { + char ch; + while (fread(&ch, 1, 1, f) > 0) + std::cout << ch; + pclose(f); + } +#else + void *array[128]; + int size = backtrace(array, 128); + char** messages = backtrace_symbols(array, size); + for (int i = 0; i < size && messages != NULL; ++i) + { + // messages[i] looks something like this: "./test(_ZN1DC1Ev+0x18) [0x415974]" + char *progName = messages[i]; + char *funcName = SplitStringNext(progName,'('); + char *offsetStr = SplitStringNext(funcName,'+'); + char *addrStr = SplitStringNext(SplitStringNext(offsetStr, ')'), '['); + char *endStr = SplitStringNext(addrStr,']'); + fprintf(stderr, "[bt]: (%d) %s [%s] %s offset: %s \n", i, progName, addrStr, abi::__cxa_demangle(funcName, 0, 0, 0), offsetStr ); + } + free(messages); +#endif +} + + +#endif + + diff --git a/Framework/StackTrace.cpp b/Framework/StackTrace.cpp new file mode 100644 index 0000000..82fafcf --- /dev/null +++ b/Framework/StackTrace.cpp @@ -0,0 +1,79 @@ +#include "StackTrace.h" +#include +#include + + +#ifdef _WIN32 + +#include "DbgHelp.h" +#include +#pragma comment(lib, "Dbghelp.lib") + +void PrintStackTrace() +{ + HANDLE process = GetCurrentProcess(); + SymInitialize(process, NULL, TRUE); + void* stack[60]; + unsigned short frames = CaptureStackBackTrace(0, 60, stack, NULL); + SYMBOL_INFO *symbol = (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1); + symbol->MaxNameLen = 255; + symbol->SizeOfStruct = sizeof(SYMBOL_INFO); + for(int i = 0; i < frames; i++) + { + SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); + printf("%i: %016I64LX %s - 0x%0X\n", frames - i - 1, stack[i], symbol->Name, symbol->Address); + } + free(symbol); +} + +#else + +#include +#include +#include + +char* SplitStringNext(char* str, char ch) +{ + if (!str) + return 0; + int i = 0; + while (str[i] && str[i] != ch) + i++; + if (!str[i]) + return 0; + str[i] = 0; + return &str[i + 1]; +} + +void PrintStackTrace() +{ +#ifdef USE_PSTACK + if (FILE* f = popen(std::string("pstack " + std::to_string(getpid()) + " | c++filt").c_str(), "r")) + { + char ch; + while (fread(&ch, 1, 1, f) > 0) + std::cout << ch; + pclose(f); + } +#else + void *array[128]; + int size = backtrace(array, 128); + char** messages = backtrace_symbols(array, size); + for (int i = 0; i < size && messages != NULL; ++i) + { + // messages[i] looks something like this: "./test(_ZN1DC1Ev+0x18) [0x415974]" + char *progName = messages[i]; + char *funcName = SplitStringNext(progName,'('); + char *offsetStr = SplitStringNext(funcName,'+'); + char *addrStr = SplitStringNext(SplitStringNext(offsetStr, ')'), '['); + char *endStr = SplitStringNext(addrStr,']'); + fprintf(stderr, "[bt]: (%d) %s [%s] %s offset: %s \n", i, progName, addrStr, abi::__cxa_demangle(funcName, 0, 0, 0), offsetStr ); + } + free(messages); +#endif +} + + +#endif + + diff --git a/Framework/StackTrace.h b/Framework/StackTrace.h new file mode 100644 index 0000000..8153460 --- /dev/null +++ b/Framework/StackTrace.h @@ -0,0 +1,8 @@ +#ifndef STACK_TRACE_H +#define STACK_TRACE_H + + +void PrintStackTrace(); + + +#endif // STACK_TRACE_H