util: log stack trace on crash

This commit is contained in:
moneromooo-monero 2018-04-12 15:17:38 +01:00 committed by wowario
parent 29954e88f3
commit 3aa058c9d9
No known key found for this signature in database
GPG key ID: 24DCBE762DE9C111

View file

@ -43,6 +43,7 @@ using namespace epee;
#include "crypto/crypto.h" #include "crypto/crypto.h"
#include "util.h" #include "util.h"
#include "stack_trace.h"
#include "memwipe.h" #include "memwipe.h"
#include "cryptonote_config.h" #include "cryptonote_config.h"
#include "net/http_client.h" // epee::net_utils::... #include "net/http_client.h" // epee::net_utils::...
@ -560,10 +561,48 @@ std::string get_nix_version_display_string()
} }
return false; return false;
} }
#ifdef STACK_TRACE
#ifdef _WIN32
// https://stackoverflow.com/questions/1992816/how-to-handle-seg-faults-under-windows
static LONG WINAPI windows_crash_handler(PEXCEPTION_POINTERS pExceptionInfo)
{
tools::log_stack_trace("crashing");
exit(1);
return EXCEPTION_CONTINUE_SEARCH;
}
static void setup_crash_dump()
{
SetUnhandledExceptionFilter(windows_crash_handler);
}
#else
static void posix_crash_handler(int signal)
{
tools::log_stack_trace(("crashing with fatal signal " + std::to_string(signal)).c_str());
#ifdef NDEBUG
_exit(1);
#else
abort();
#endif
}
static void setup_crash_dump()
{
signal(SIGSEGV, posix_crash_handler);
signal(SIGBUS, posix_crash_handler);
signal(SIGILL, posix_crash_handler);
signal(SIGFPE, posix_crash_handler);
}
#endif
#else
static void setup_crash_dump() {}
#endif
bool on_startup() bool on_startup()
{ {
mlog_configure("", true); mlog_configure("", true);
setup_crash_dump();
sanitize_locale(); sanitize_locale();
#ifdef __GLIBC__ #ifdef __GLIBC__