blob: 05b40bc3afe18e24dd46effa9e3302011f361a4a [file] [log] [blame]
/* -*- Mode: C++; tab-width: 4 indent-tabs-mode: nil -*-
*
* Copyright (c) 2015 Nest Labs, Inc.
* All rights reserved.
*
* This document is the property of Nest. It is considered
* confidential and proprietary information.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Nest.
*
* Description:
* This is the source file used to hook into gtest framework to
* catch exceptions of fatal error.
*
*/
#include <signal.h>
#include <ostream>
#include <stdexcept>
#include <execinfo.h>
#include "gtest.h"
#include "nlgtest-exceptions.h"
using namespace std;
static void gtest_error_handler(int signum, siginfo_t *sig_info, void *context);
void gtest_register_error_handlers() {
struct sigaction error_actions;
sigemptyset(&error_actions.sa_mask);
error_actions.sa_sigaction = gtest_error_handler;
error_actions.sa_flags = SA_SIGINFO;
assert(sigaction(SIGSEGV, &error_actions,NULL) == 0);
}
static void gtest_error_handler(int signum, siginfo_t *sig_info, void *context) {
sigset_t x;
/*
int trace_size;
void *buffer[100];
char **strings = (char **)NULL;
trace_size = backtrace(buffer, 100);
printf("Received error signal %d. Backtrace() returned %d addresses\n", signum, trace_size);
strings = backtrace_symbols(buffer, trace_size);
if (strings == NULL) {
printf("backtrace_symbols failed!!!");
goto done;
}
for (int i = 0; i < trace_size; i++) {
char syscom[256];
printf("#%d, strings %s, trace %d\n", i, strings[i], buffer[i]);
sprintf(syscom,"addr2line %p -e sighandler", buffer[i]); //last parameter is the name of this app
system(syscom);
sprintf(syscom,"addr2line %p -e aaaaaaa", buffer[i]); //last parameter is the name of this app
system(syscom);
}
free(strings);
printf("Received error signal %s. At address %x \n", signum == SIGSEGV ? "SIGSEGV" : "unknown", sig_info->si_addr);
*/
printf("Received error signal %s.\n", signum == SIGSEGV ? "SIGSEGV" : "unknown");
sigemptyset (&x);
sigaddset(&x, SIGSEGV);
sigprocmask(SIG_UNBLOCK, &x, NULL);
FAILURE_NO_MSG;
}
void gtest_unregister_error_handlers() {
struct sigaction default_actions;
default_actions.sa_handler = SIG_DFL;
default_actions.sa_flags = 0;
assert(sigaction(SIGSEGV, &default_actions,NULL) == 0);
}