mirror of
https://github.com/wolfpld/tracy
synced 2025-05-01 13:13:53 +00:00
always override unhandled exception filter
This commit is contained in:
parent
cc860fe56a
commit
97a6a3dde7
@ -1502,16 +1502,15 @@ void Profiler::InstallCrashHandler()
|
|||||||
sigaction( SIGPIPE, &crashHandler, &m_prevSignal.pipe );
|
sigaction( SIGPIPE, &crashHandler, &m_prevSignal.pipe );
|
||||||
sigaction( SIGBUS, &crashHandler, &m_prevSignal.bus );
|
sigaction( SIGBUS, &crashHandler, &m_prevSignal.bus );
|
||||||
sigaction( SIGABRT, &crashHandler, &m_prevSignal.abrt );
|
sigaction( SIGABRT, &crashHandler, &m_prevSignal.abrt );
|
||||||
|
|
||||||
m_crashHandlerInstalled = true;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined _WIN32 && !defined TRACY_UWP && !defined TRACY_NO_CRASH_HANDLER
|
#if defined _WIN32 && !defined TRACY_UWP && !defined TRACY_NO_CRASH_HANDLER
|
||||||
// We cannot use Vectored Exception handling because it catches application-wide frame-based SEH blocks. We only
|
// We cannot use Vectored Exception handling because it catches application-wide frame-based SEH blocks. We only
|
||||||
// want to catch unhandled exceptions in the event that there is not already an unhandled exception filter.
|
// want to catch unhandled exceptions.
|
||||||
if( auto prev = SetUnhandledExceptionFilter( CrashFilter ) )
|
m_prevHandler = SetUnhandledExceptionFilter( CrashFilter );
|
||||||
SetUnhandledExceptionFilter( prev ); // Already had a handler => put it back
|
#endif
|
||||||
else
|
|
||||||
|
#ifndef TRACY_NO_CRASH_HANDLER
|
||||||
m_crashHandlerInstalled = true;
|
m_crashHandlerInstalled = true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1519,10 +1518,10 @@ void Profiler::InstallCrashHandler()
|
|||||||
|
|
||||||
void Profiler::RemoveCrashHandler()
|
void Profiler::RemoveCrashHandler()
|
||||||
{
|
{
|
||||||
#if defined _WIN32 && !defined TRACY_UWP
|
#if defined _WIN32 && !defined TRACY_UWP && !defined TRACY_NO_CRASH_HANDLER
|
||||||
if( m_crashHandlerInstalled )
|
if( m_crashHandlerInstalled )
|
||||||
{
|
{
|
||||||
auto prev = SetUnhandledExceptionFilter( NULL );
|
auto prev = SetUnhandledExceptionFilter( (LPTOP_LEVEL_EXCEPTION_FILTER)m_prevHandler );
|
||||||
if( prev != CrashFilter )
|
if( prev != CrashFilter )
|
||||||
SetUnhandledExceptionFilter( prev ); // A different exception filter was installed over ours => put it back
|
SetUnhandledExceptionFilter( prev ); // A different exception filter was installed over ours => put it back
|
||||||
}
|
}
|
||||||
@ -1531,13 +1530,19 @@ void Profiler::RemoveCrashHandler()
|
|||||||
#if defined __linux__ && !defined TRACY_NO_CRASH_HANDLER
|
#if defined __linux__ && !defined TRACY_NO_CRASH_HANDLER
|
||||||
if( m_crashHandlerInstalled )
|
if( m_crashHandlerInstalled )
|
||||||
{
|
{
|
||||||
sigaction( TRACY_CRASH_SIGNAL, &m_prevSignal.pwr, nullptr );
|
auto restore = [this]( int signum, struct sigaction* prev ) {
|
||||||
sigaction( SIGILL, &m_prevSignal.ill, nullptr );
|
struct sigaction old;
|
||||||
sigaction( SIGFPE, &m_prevSignal.fpe, nullptr );
|
sigaction( signum, prev, &old );
|
||||||
sigaction( SIGSEGV, &m_prevSignal.segv, nullptr );
|
if( old.sa_sigaction != CrashHandler )
|
||||||
sigaction( SIGPIPE, &m_prevSignal.pipe, nullptr );
|
sigaction( signum, &old, nullptr ); // A different signal handler was installed over ours => put it back
|
||||||
sigaction( SIGBUS, &m_prevSignal.bus, nullptr );
|
};
|
||||||
sigaction( SIGABRT, &m_prevSignal.abrt, nullptr );
|
restore( TRACY_CRASH_SIGNAL, &m_prevSignal.pwr );
|
||||||
|
restore( SIGILL, &m_prevSignal.ill );
|
||||||
|
restore( SIGFPE, &m_prevSignal.fpe );
|
||||||
|
restore( SIGSEGV, &m_prevSignal.segv );
|
||||||
|
restore( SIGPIPE, &m_prevSignal.pipe );
|
||||||
|
restore( SIGBUS, &m_prevSignal.bus );
|
||||||
|
restore( SIGABRT, &m_prevSignal.abrt );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
m_crashHandlerInstalled = false;
|
m_crashHandlerInstalled = false;
|
||||||
|
@ -1012,7 +1012,9 @@ private:
|
|||||||
char* m_safeSendBuffer;
|
char* m_safeSendBuffer;
|
||||||
size_t m_safeSendBufferSize;
|
size_t m_safeSendBufferSize;
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if defined _WIN32
|
||||||
|
void* m_prevHandler;
|
||||||
|
#else
|
||||||
int m_pipe[2];
|
int m_pipe[2];
|
||||||
int m_pipeBufSize;
|
int m_pipeBufSize;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user