Merge pull request #3624

d8584fc8 util: log stack trace on crash (moneromooo-monero)
This commit is contained in:
Riccardo Spagni 2018-04-21 21:55:01 +02:00
commit e6cf9c06fc
No known key found for this signature in database
GPG Key ID: 55432DF31CCD4FCD
1 changed files with 39 additions and 0 deletions

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__