diff --git a/public/client/TracyProfiler.cpp b/public/client/TracyProfiler.cpp index 84c246f2e8..95ac6574e0 100644 --- a/public/client/TracyProfiler.cpp +++ b/public/client/TracyProfiler.cpp @@ -10,6 +10,9 @@ # include # include # include "../common/TracyUwp.hpp" +# ifndef _MSC_VER +# include +# endif #else # include # include @@ -905,6 +908,13 @@ LONG WINAPI CrashFilter( PEXCEPTION_POINTERS pExp ) } #endif +#if defined _WIN32 && !defined _MSC_VER +LONG WINAPI CrashFilterExecute( PEXCEPTION_POINTERS pExp ) +{ + return EXCEPTION_EXECUTE_HANDLER; +} +#endif + static Profiler* s_instance = nullptr; static Thread* s_thread; #ifndef TRACY_NO_FRAME_IMAGE @@ -1507,7 +1517,7 @@ void Profiler::InstallCrashHandler() #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 // want to catch unhandled exceptions. - m_prevHandler = SetUnhandledExceptionFilter( CrashFilter ); + m_prevHandler = reinterpret_cast( SetUnhandledExceptionFilter( CrashFilter ) ); #endif #ifndef TRACY_NO_CRASH_HANDLER @@ -3109,6 +3119,7 @@ char* Profiler::SafeCopyProlog( const char* data, size_t size ) if( size > SafeSendBufferSize ) buf = (char*)tracy_malloc( size ); #ifdef _WIN32 +# ifdef _MSC_VER __try { memcpy( buf, data, size ); @@ -3117,6 +3128,16 @@ char* Profiler::SafeCopyProlog( const char* data, size_t size ) { success = false; } +# else + __try1( CrashFilterExecute ) + { + memcpy( buf, data, size ); + } + __except1 + { + success = false; + } +# endif #else // Send through the pipe to ensure safe reads for( size_t offset = 0; offset != size; /*in loop*/ )