diff --git a/engine/common/host.c b/engine/common/host.c index 3a3aeb98..70cb51c5 100644 --- a/engine/common/host.c +++ b/engine/common/host.c @@ -1043,7 +1043,7 @@ static void Host_InitCommon( int argc, char **argv, const char *progname, qboole } if( !Sys_CheckParm( "-noch" )) - Sys_SetupCrashHandler(); + Sys_SetupCrashHandler( argv[0] ); #if XASH_DLL_LOADER host.enabledll = !Sys_CheckParm( "-nodll" ); diff --git a/engine/platform/platform.h b/engine/platform/platform.h index fc7fdee0..5bc6b35a 100644 --- a/engine/platform/platform.h +++ b/engine/platform/platform.h @@ -179,10 +179,10 @@ static inline void Platform_Sleep( int msec ) } #if XASH_WIN32 || XASH_FREEBSD || XASH_NETBSD || XASH_OPENBSD || XASH_ANDROID || XASH_LINUX || XASH_APPLE -void Sys_SetupCrashHandler( void ); +void Sys_SetupCrashHandler( const char *argv0 ); void Sys_RestoreCrashHandler( void ); #else -static inline void Sys_SetupCrashHandler( void ) +static inline void Sys_SetupCrashHandler( const char *argv0 ) { } diff --git a/engine/platform/posix/crash_posix.c b/engine/platform/posix/crash_posix.c index 46b35461..0292009f 100644 --- a/engine/platform/posix/crash_posix.c +++ b/engine/platform/posix/crash_posix.c @@ -45,16 +45,16 @@ static int Sys_PrintFrame( char *buf, int len, int i, void *addr ) if( len <= 0 ) return 0; // overflow - if( dladdr( addr, &dlinfo )) - { - if( dlinfo.dli_sname ) - return Q_snprintf( buf, len, "%2d: %p <%s+%lu> (%s)\n", i, addr, dlinfo.dli_sname, - (unsigned long)addr - (unsigned long)dlinfo.dli_saddr, dlinfo.dli_fname ); // print symbol, module and address + if( dladdr( addr, &dlinfo )) + { + if( dlinfo.dli_sname ) + return Q_snprintf( buf, len, "%2d: %p <%s+%lu> (%s)\n", i, addr, dlinfo.dli_sname, + (unsigned long)addr - (unsigned long)dlinfo.dli_saddr, dlinfo.dli_fname ); // print symbol, module and address - return Q_snprintf( buf, len, "%2d: %p (%s)\n", i, addr, dlinfo.dli_fname ); // print module and address - } + return Q_snprintf( buf, len, "%2d: %p (%s)\n", i, addr, dlinfo.dli_fname ); // print module and address + } - return Q_snprintf( buf, len, "%2d: %p\n", i, addr ); // print only address + return Q_snprintf( buf, len, "%2d: %p\n", i, addr ); // print only address } void Sys_Crash( int signal, siginfo_t *si, void *context ) @@ -206,7 +206,7 @@ void Sys_Crash( int signal, siginfo_t *si, void *context ) #endif // !HAVE_EXECINFO -void Sys_SetupCrashHandler( void ) +void Sys_SetupCrashHandler( const char *argv0 ) { struct sigaction act = { 0 }; act.sa_sigaction = Sys_Crash; diff --git a/engine/platform/win32/crash_win.c b/engine/platform/win32/crash_win.c index d134adc3..284f9e88 100644 --- a/engine/platform/win32/crash_win.c +++ b/engine/platform/win32/crash_win.c @@ -318,7 +318,7 @@ static long _stdcall Sys_Crash( PEXCEPTION_POINTERS pInfo ) return EXCEPTION_CONTINUE_EXECUTION; } -void Sys_SetupCrashHandler( void ) +void Sys_SetupCrashHandler( const char *argv0 ) { SetErrorMode( SEM_FAILCRITICALERRORS ); // no abort/retry/fail errors oldFilter = SetUnhandledExceptionFilter( Sys_Crash );