ult: catch&handle SIGABRT

Change-Id: Ifaeed398d0e8a462ab1c6560b775453bbb2328a2
This commit is contained in:
Artur Harasimiuk
2018-03-12 11:35:53 +01:00
committed by sys_ocldev
parent cc6fa3d1e1
commit edfdf3c66a

View File

@ -109,6 +109,20 @@ void handle_SIGSEGV(int signal) {
std::cout << "SIGSEGV on: " << lastTest << std::endl;
abort();
}
struct sigaction oldSigAbrt;
void handle_SIGABRT(int signal) {
std::cout << "SIGABRT on: " << lastTest << std::endl;
// restore signal handler to abort
if (sigaction(SIGABRT, &oldSigAbrt, nullptr) == -1) {
std::cout << "FATAL: cannot fatal SIGABRT handler" << std::endl;
std::cout << "FATAL: try SEGV" << std::endl;
uint8_t *ptr = nullptr;
*ptr = 0;
std::cout << "FATAL: still alive, call exit()" << std::endl;
exit(-1);
}
raise(signal);
}
#else
LONG WINAPI UltExceptionFilter(
_In_ struct _EXCEPTION_POINTERS *exceptionInfo) {
@ -161,6 +175,7 @@ int main(int argc, char **argv) {
bool useDefaultListener = false;
bool enable_alarm = true;
bool enable_segv = true;
bool enable_abrt = true;
applyWorkarounds();
@ -384,6 +399,17 @@ int main(int argc, char **argv) {
return -2;
}
}
if (enable_abrt) {
struct sigaction sa;
sa.sa_handler = &handle_SIGABRT;
sa.sa_flags = SA_RESTART;
sigfillset(&sa.sa_mask);
if (sigaction(SIGABRT, &sa, &oldSigAbrt) == -1) {
printf("FATAL ERROR: cannot intercept SIGABRT\n");
return -2;
}
}
#else
SetUnhandledExceptionFilter(&UltExceptionFilter);
#endif