From 877cb324d181e6f178d3c68f107b2471f95732f1 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Fri, 19 Mar 2004 03:13:27 +0000 Subject: [PATCH] better output on extra signal --- stepmania/src/archutils/Unix/CrashHandler.cpp | 64 +++++++++++++++++-- .../src/archutils/Unix/CrashHandlerChild.cpp | 43 +------------ .../src/archutils/Unix/CrashHandlerInternal.h | 2 + 3 files changed, 63 insertions(+), 46 deletions(-) diff --git a/stepmania/src/archutils/Unix/CrashHandler.cpp b/stepmania/src/archutils/Unix/CrashHandler.cpp index 2a762cebc9..d553bd54f1 100644 --- a/stepmania/src/archutils/Unix/CrashHandler.cpp +++ b/stepmania/src/archutils/Unix/CrashHandler.cpp @@ -168,6 +168,63 @@ static const char *itoa(unsigned n) return p; } +const char *SignalName( int signo ) +{ +#if !defined(DARWIN) +#define X(a) case a: return #a; + switch( signo ) + { + case SIGALRM: return "Alarm"; + case SIGBUS: return "Bus error"; + case SIGFPE: return "Floating point exception"; + X(SIGHUP) + case SIGILL: return "Illegal instruction"; + X(SIGINT) + case SIGPIPE: return "Broken pipe"; + case SIGABRT: return "Aborted"; + X(SIGQUIT) + case SIGSEGV: return "Segmentation fault"; + X(SIGTRAP) X(SIGTERM) X(SIGVTALRM) X(SIGXCPU) X(SIGXFSZ) +#if defined(HAVE_DECL_SIGPWR) && HAVE_DECL_SIGPWR + X(SIGPWR) +#endif + default: + { + static char buf[128]; + strcpy( buf, "Unknown signal " ); + strcat( buf, itoa(signo) ); + return buf; + } + } +#else +#define X(code) case k##code: return #code; + switch( signo ) + { + X(UnknownException) + X(IllegalInstructionException) + X(TrapException) + X(AccessException) + X(UnmappedMemoryException) + X(ExcludedMemoryException) + X(ReadOnlyMemoryException) + X(UnresolvablePageFaultException) + X(PrivilegeViolationException) + X(TraceException) + X(InstructionBreakpointException) + X(DataBreakpointException) + X(FloatingPointException) + X(StackOverflowException) + default: + { + static char buf[128]; + strcpy( buf, "Unknown exception " ); + strcat( buf, itoa(signo) ); + return buf; + } + } +#endif +} + void CrashSignalHandler( int signal ) { if( g_pCrashHandlerArgv0 == NULL ) @@ -186,12 +243,11 @@ void CrashSignalHandler( int signal ) * crashed. */ const char *str; if( received == getpid() ) - str = "Oops! Fatal signal received while still in the crash handler\n"; + safe_print( fileno(stderr), "Oops! Fatal signal (", SignalName(signal), ") received while still in the crash handler\n", NULL); else if( childpid == getpid() ) - str = "Oops! Fatal signal received while in the crash handler child\n"; + safe_print( fileno(stderr), "Oops! Fatal signal (", SignalName(signal), ") received while in the crash handler child\n", NULL); else - str = "Extra fatal signal received\n"; // probably another thread crashing - write( fileno(stderr), str, strlen(str) ); + safe_print( fileno(stderr), "Extra fatal signal (", SignalName(signal), ") received\n", NULL); _exit(1); } received = getpid(); diff --git a/stepmania/src/archutils/Unix/CrashHandlerChild.cpp b/stepmania/src/archutils/Unix/CrashHandlerChild.cpp index d60608fe60..b8c0159404 100644 --- a/stepmania/src/archutils/Unix/CrashHandlerChild.cpp +++ b/stepmania/src/archutils/Unix/CrashHandlerChild.cpp @@ -142,48 +142,7 @@ static void child_process() fprintf(CrashDump, "--------------------------------------\n"); fprintf(CrashDump, "\n"); - CString Signal; -#if !defined(DARWIN) -#define X(a) case a: Signal = #a; break; - switch(SignalReceived) - { - case SIGALRM: Signal = "Alarm"; break; - case SIGBUS: Signal = "Bus error"; break; - case SIGFPE: Signal = "Floating point exception"; break; - X(SIGHUP) - case SIGILL: Signal = "Illegal instruction"; break; - X(SIGINT) - case SIGPIPE: Signal = "Broken pipe"; break; - case SIGABRT: Signal = "Aborted"; break; - X(SIGQUIT) - case SIGSEGV: Signal = "Segmentation fault"; break; - X(SIGTRAP) X(SIGTERM) X(SIGVTALRM) X(SIGXCPU) X(SIGXFSZ) -#if defined(HAVE_DECL_SIGPWR) && HAVE_DECL_SIGPWR - X(SIGPWR) -#endif - default: Signal = ssprintf("Unknown signal %i", SignalReceived); break; - } -#else -#define X(code) case k##code: Signal = #code; break; - switch (SignalReceived) - { - X(UnknownException) - X(IllegalInstructionException) - X(TrapException) - X(AccessException) - X(UnmappedMemoryException) - X(ExcludedMemoryException) - X(ReadOnlyMemoryException) - X(UnresolvablePageFaultException) - X(PrivilegeViolationException) - X(TraceException) - X(InstructionBreakpointException) - X(DataBreakpointException) - X(FloatingPointException) - X(StackOverflowException) - default: Signal = ssprintf("Unknown Exception %i", SignalReceived); break; - } -#endif + CString Signal = SignalName( SignalReceived ); fprintf( CrashDump, "Crash reason: %s\n", Signal.c_str() ); fprintf( CrashDump, "Crashed thread: %s\n\n", CrashedThread.c_str() ); diff --git a/stepmania/src/archutils/Unix/CrashHandlerInternal.h b/stepmania/src/archutils/Unix/CrashHandlerInternal.h index 303d246d74..0bc1f2268b 100644 --- a/stepmania/src/archutils/Unix/CrashHandlerInternal.h +++ b/stepmania/src/archutils/Unix/CrashHandlerInternal.h @@ -4,5 +4,7 @@ #define BACKTRACE_MAX_SIZE 1024 #define CHILD_MAGIC_PARAMETER "--private-do-crash-handler" +const char *SignalName( int signo ); + #endif