1//===------------------------- abort_message.cpp --------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include <stdlib.h> 11#include <stdio.h> 12#include <stdarg.h> 13#include "abort_message.h" 14 15#ifdef __BIONIC__ 16#include <android/api-level.h> 17#if __ANDROID_API__ >= 21 18#include <syslog.h> 19extern "C" void android_set_abort_message(const char* msg); 20#else 21#include <assert.h> 22#endif // __ANDROID_API__ >= 21 23#endif // __BIONIC__ 24 25#pragma GCC visibility push(hidden) 26 27#ifdef __APPLE__ 28# if defined(__has_include) && __has_include(<CrashReporterClient.h>) 29# define HAVE_CRASHREPORTERCLIENT_H 30# include <CrashReporterClient.h> 31# endif 32#endif 33 34__attribute__((visibility("hidden"), noreturn)) 35void abort_message(const char* format, ...) 36{ 37 // write message to stderr 38#ifdef __APPLE__ 39 fprintf(stderr, "libc++abi.dylib: "); 40#endif 41 va_list list; 42 va_start(list, format); 43 vfprintf(stderr, format, list); 44 va_end(list); 45 fprintf(stderr, "\n"); 46 47#if defined(__APPLE__) && defined(HAVE_CRASHREPORTERCLIENT_H) 48 // record message in crash report 49 char* buffer; 50 va_list list2; 51 va_start(list2, format); 52 vasprintf(&buffer, format, list2); 53 va_end(list2); 54 CRSetCrashLogMessage(buffer); 55#elif defined(__BIONIC__) 56 char* buffer; 57 va_list list2; 58 va_start(list2, format); 59 vasprintf(&buffer, format, list2); 60 va_end(list2); 61 62#if __ANDROID_API__ >= 21 63 // Show error in tombstone. 64 android_set_abort_message(buffer); 65 66 // Show error in logcat. 67 openlog("libc++abi", 0, 0); 68 syslog(LOG_CRIT, "%s", buffer); 69 closelog(); 70#else 71 // The good error reporting wasn't available in Android until L. Since we're 72 // about to abort anyway, just call __assert2, which will log _somewhere_ 73 // (tombstone and/or logcat) in older releases. 74 __assert2(__FILE__, __LINE__, __func__, buffer); 75#endif // __ANDROID_API__ >= 21 76#endif // __BIONIC__ 77 78 abort(); 79} 80 81#pragma GCC visibility pop 82