better output on extra signal
This commit is contained in:
@@ -168,6 +168,63 @@ static const char *itoa(unsigned n)
|
|||||||
return p;
|
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 )
|
void CrashSignalHandler( int signal )
|
||||||
{
|
{
|
||||||
if( g_pCrashHandlerArgv0 == NULL )
|
if( g_pCrashHandlerArgv0 == NULL )
|
||||||
@@ -186,12 +243,11 @@ void CrashSignalHandler( int signal )
|
|||||||
* crashed. */
|
* crashed. */
|
||||||
const char *str;
|
const char *str;
|
||||||
if( received == getpid() )
|
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() )
|
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
|
else
|
||||||
str = "Extra fatal signal received\n"; // probably another thread crashing
|
safe_print( fileno(stderr), "Extra fatal signal (", SignalName(signal), ") received\n", NULL);
|
||||||
write( fileno(stderr), str, strlen(str) );
|
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
received = getpid();
|
received = getpid();
|
||||||
|
|||||||
@@ -142,48 +142,7 @@ static void child_process()
|
|||||||
fprintf(CrashDump, "--------------------------------------\n");
|
fprintf(CrashDump, "--------------------------------------\n");
|
||||||
fprintf(CrashDump, "\n");
|
fprintf(CrashDump, "\n");
|
||||||
|
|
||||||
CString Signal;
|
CString Signal = SignalName( SignalReceived );
|
||||||
#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
|
|
||||||
|
|
||||||
fprintf( CrashDump, "Crash reason: %s\n", Signal.c_str() );
|
fprintf( CrashDump, "Crash reason: %s\n", Signal.c_str() );
|
||||||
fprintf( CrashDump, "Crashed thread: %s\n\n", CrashedThread.c_str() );
|
fprintf( CrashDump, "Crashed thread: %s\n\n", CrashedThread.c_str() );
|
||||||
|
|||||||
@@ -4,5 +4,7 @@
|
|||||||
#define BACKTRACE_MAX_SIZE 1024
|
#define BACKTRACE_MAX_SIZE 1024
|
||||||
#define CHILD_MAGIC_PARAMETER "--private-do-crash-handler"
|
#define CHILD_MAGIC_PARAMETER "--private-do-crash-handler"
|
||||||
|
|
||||||
|
const char *SignalName( int signo );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user