1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#import <Foundation/Foundation.h> 6#include <mach/task.h> 7#include <stdio.h> 8 9#include "base/logging.h" 10 11// This is just enough of a shim to let the support needed by test_support 12// link. 13 14namespace base { 15namespace debug { 16 17namespace { 18 19void StackDumpSignalHandler(int signal) { 20 // TODO(phajdan.jr): Fix async-signal unsafety. 21 LOG(ERROR) << "Received signal " << signal; 22 NSArray *stack_symbols = [NSThread callStackSymbols]; 23 for (NSString* stack_symbol in stack_symbols) { 24 fprintf(stderr, "\t%s\n", [stack_symbol UTF8String]); 25 } 26 _exit(1); 27} 28 29} // namespace 30 31// TODO(phajdan.jr): Deduplicate, see copy in stack_trace_posix.cc. 32bool EnableInProcessStackDumping() { 33 // When running in an application, our code typically expects SIGPIPE 34 // to be ignored. Therefore, when testing that same code, it should run 35 // with SIGPIPE ignored as well. 36 struct sigaction action; 37 action.sa_handler = SIG_IGN; 38 action.sa_flags = 0; 39 sigemptyset(&action.sa_mask); 40 bool success = (sigaction(SIGPIPE, &action, NULL) == 0); 41 42 success &= (signal(SIGILL, &StackDumpSignalHandler) != SIG_ERR); 43 success &= (signal(SIGABRT, &StackDumpSignalHandler) != SIG_ERR); 44 success &= (signal(SIGFPE, &StackDumpSignalHandler) != SIG_ERR); 45 success &= (signal(SIGBUS, &StackDumpSignalHandler) != SIG_ERR); 46 success &= (signal(SIGSEGV, &StackDumpSignalHandler) != SIG_ERR); 47 success &= (signal(SIGSYS, &StackDumpSignalHandler) != SIG_ERR); 48 49 return success; 50} 51 52} // namespace debug 53} // namespace base 54