void CrashHandler::ForceDeadlock( RString reason, uint64_t iID ) { CrashData crash; memset( &crash, 0, sizeof(crash) ); crash.type = CrashData::FORCE_CRASH; GetBacktrace( crash.BacktracePointers[0], BACKTRACE_MAX_SIZE, NULL ); if( iID == GetInvalidThreadId() ) { /* Backtrace all threads. */ BacktraceAllThreads( crash ); } else { BacktraceContext ctx; if( !GetThreadBacktraceContext( iID, &ctx ) ) reason += "; GetThreadBacktraceContext failed"; else GetBacktrace( crash.BacktracePointers[1], BACKTRACE_MAX_SIZE, &ctx ); strncpy( crash.m_ThreadName[1], RageThread::GetThreadNameByID(iID), sizeof(crash.m_ThreadName[0])-1 ); } strncpy( crash.m_ThreadName[0], RageThread::GetCurrentThreadName(), sizeof(crash.m_ThreadName[0])-1 ); strncpy( crash.reason, reason, min(sizeof(crash.reason) - 1, reason.length()) ); crash.reason[ sizeof(crash.reason)-1 ] = 0; RunCrashHandler( &crash ); _exit( 1 ); }
void CrashHandler::ForceCrash( const char *reason ) { CrashData crash; memset( &crash, 0, sizeof(crash) ); crash.type = CrashData::FORCE_CRASH; strncpy( crash.reason, reason, sizeof(crash.reason) ); crash.reason[ sizeof(crash.reason)-1 ] = 0; GetBacktrace( crash.BacktracePointers[0], BACKTRACE_MAX_SIZE, NULL ); RunCrashHandler( &crash ); }
void CrashHandler::ForceCrash( std::string const &reason ) { CrashData crash; std::memset( &crash, 0, sizeof(crash) ); crash.type = CrashData::FORCE_CRASH; std::strncpy( crash.reason, reason.c_str(), sizeof(crash.reason) ); crash.reason[ sizeof(crash.reason)-1 ] = 0; GetBacktrace( crash.BacktracePointers[0], BACKTRACE_MAX_SIZE, nullptr ); RunCrashHandler( &crash ); }
void CrashHandler::CrashSignalHandler( int signal, siginfo_t *si, const ucontext_t *uc ) { static volatile bool bInCrashSignalHandler = false; if( bInCrashSignalHandler ) { safe_print( 2, "Fatal: crash from within the crash signal handler\n", NULL ); _exit(1); } bInCrashSignalHandler = true; /* Work around a gcc bug: it reorders the above assignment past other work down * here, even if we declare it volatile. This makes us not catch recursive * crashes. */ asm volatile("nop"); CrashData crash; memset( &crash, 0, sizeof(crash) ); crash.type = CrashData::SIGNAL; crash.signal = signal; crash.si = *si; BacktraceContext ctx; GetSignalBacktraceContext( &ctx, uc ); GetBacktrace( crash.BacktracePointers[0], BACKTRACE_MAX_SIZE, &ctx ); #if defined(HAVE_DECL_SIGUSR1) && HAVE_DECL_SIGUSR1 if( signal == SIGUSR1 ) BacktraceAllThreads( crash ); #endif strncpy( crash.m_ThreadName[0], RageThread::GetCurrentThreadName(), sizeof(crash.m_ThreadName[0])-1 ); bInCrashSignalHandler = false; /* RunCrashHandler handles any recursive crashes of its own by itself. */ RunCrashHandler( &crash ); }
void CDump::DeclareDumpFile(string DumpFilePath){ szMbsFile = DumpFilePath; RunCrashHandler(); return; }