forked from teamnwah/openmw-tes3coop
[Server] Add stacktrace
parent
916ada108f
commit
a3d5fbbdcd
@ -0,0 +1,73 @@
|
|||||||
|
//
|
||||||
|
// Created by koncord on 25.10.17.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "stacktrace.hpp"
|
||||||
|
#include <components/openmw-mp/Log.hpp>
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
|
||||||
|
#include <execinfo.h>
|
||||||
|
|
||||||
|
void stacktrace()
|
||||||
|
{
|
||||||
|
LOG_MESSAGE_SIMPLE(Log::LOG_FATAL, "Stacktrace:");
|
||||||
|
|
||||||
|
void *array[50];
|
||||||
|
int size = backtrace(array, 50);
|
||||||
|
|
||||||
|
auto messages = backtrace_symbols(array, size);
|
||||||
|
|
||||||
|
size_t funcnamesize = 256;
|
||||||
|
auto funcname = (char *) malloc(funcnamesize);
|
||||||
|
//skip first stack frame (points here)
|
||||||
|
for (int i = 1; i < size && messages != nullptr; ++i)
|
||||||
|
{
|
||||||
|
char *beginName = nullptr, *beginOffset = nullptr, *endOffset = nullptr;
|
||||||
|
for (char *p = messages[i]; *p; ++p)
|
||||||
|
{
|
||||||
|
if (*p == '(')
|
||||||
|
beginName = p;
|
||||||
|
else if (*p == '+')
|
||||||
|
beginOffset = p;
|
||||||
|
else if (*p == ')' && beginOffset)
|
||||||
|
{
|
||||||
|
endOffset = p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (beginName && beginOffset && endOffset && beginName < beginOffset)
|
||||||
|
{
|
||||||
|
*beginName++ = '\0';
|
||||||
|
*beginOffset++ = '\0';
|
||||||
|
*endOffset = '\0';
|
||||||
|
|
||||||
|
// mangled name is now in [beginName, beginOffset) and caller offset in [beginOffset, endOffset).
|
||||||
|
|
||||||
|
int status;
|
||||||
|
char *ret = abi::__cxa_demangle(beginName, funcname, &funcnamesize, &status);
|
||||||
|
if (status == 0)
|
||||||
|
{
|
||||||
|
funcname = ret; // use possibly realloc()-ed string
|
||||||
|
LOG_APPEND(Log::LOG_FATAL, "\t%s : %s+%s", messages[i], funcname, beginOffset);
|
||||||
|
}
|
||||||
|
else // demangling failed.
|
||||||
|
LOG_APPEND(Log::LOG_FATAL, "\t%s : %s()+%s", messages[i], beginName, beginOffset);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_APPEND(Log::LOG_FATAL, "\t%s", messages[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(messages);
|
||||||
|
free(funcname);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
void stacktrace()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,10 @@
|
|||||||
|
//
|
||||||
|
// Created by koncord on 25.10.17.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OPENMW_STACKTRACE_HPP
|
||||||
|
#define OPENMW_STACKTRACE_HPP
|
||||||
|
|
||||||
|
void stacktrace();
|
||||||
|
|
||||||
|
#endif //OPENMW_STACKTRACE_HPP
|
Loading…
Reference in New Issue