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/set_abort_message.h>
17#include <syslog.h>
18#endif
19
20#pragma GCC visibility push(hidden)
21
22#if __APPLE__
23#   if defined(__has_include) && __has_include(<CrashReporterClient.h>)
24#       define HAVE_CRASHREPORTERCLIENT_H 1
25#       include <CrashReporterClient.h>
26#   endif
27#endif
28
29__attribute__((visibility("hidden"), noreturn))
30void abort_message(const char* format, ...)
31{
32    // write message to stderr
33#if __APPLE__
34    fprintf(stderr, "libc++abi.dylib: ");
35#endif
36    va_list list;
37    va_start(list, format);
38    vfprintf(stderr, format, list);
39    va_end(list);
40    fprintf(stderr, "\n");
41
42#if __APPLE__ && HAVE_CRASHREPORTERCLIENT_H
43    // record message in crash report
44    char* buffer;
45    va_list list2;
46    va_start(list2, format);
47    vasprintf(&buffer, format, list2);
48    va_end(list2);
49    CRSetCrashLogMessage(buffer);
50#elif __BIONIC__
51    char* buffer;
52    va_list list2;
53    va_start(list2, format);
54    vasprintf(&buffer, format, list2);
55    va_end(list2);
56
57    // Show error in tombstone.
58    android_set_abort_message(buffer);
59
60    // Show error in logcat.
61    openlog("libc++abi", 0, 0);
62    syslog(LOG_CRIT, "%s", buffer);
63    closelog();
64#endif
65
66    abort();
67}
68
69#pragma GCC visibility pop
70