1507125afSLouis Dionne //===----------------------------------------------------------------------===// 2507125afSLouis Dionne // 3507125afSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4507125afSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5507125afSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6507125afSLouis Dionne // 7507125afSLouis Dionne //===----------------------------------------------------------------------===// 8507125afSLouis Dionne 9507125afSLouis Dionne #include <__config> 10507125afSLouis Dionne #include <__verbose_abort> 11507125afSLouis Dionne #include <cstdarg> 12507125afSLouis Dionne #include <cstdio> 13507125afSLouis Dionne #include <cstdlib> 14507125afSLouis Dionne 15507125afSLouis Dionne #ifdef __BIONIC__ 16507125afSLouis Dionne # include <syslog.h> 17507125afSLouis Dionne extern "C" void android_set_abort_message(const char* msg); 18507125afSLouis Dionne #endif // __BIONIC__ 19507125afSLouis Dionne 20507125afSLouis Dionne #if defined(__APPLE__) && __has_include(<CrashReporterClient.h>) 21507125afSLouis Dionne # include <CrashReporterClient.h> 22507125afSLouis Dionne #endif 23507125afSLouis Dionne 24507125afSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 25507125afSLouis Dionne 26*d269ec32SLouis Dionne _LIBCPP_WEAK void __libcpp_verbose_abort(char const* format, ...) _LIBCPP_VERBOSE_ABORT_NOEXCEPT { 27507125afSLouis Dionne // Write message to stderr. We do this before formatting into a 28507125afSLouis Dionne // buffer so that we still get some information out if that fails. 29507125afSLouis Dionne { 30507125afSLouis Dionne va_list list; 31507125afSLouis Dionne va_start(list, format); 32507125afSLouis Dionne std::vfprintf(stderr, format, list); 33507125afSLouis Dionne va_end(list); 34507125afSLouis Dionne } 35507125afSLouis Dionne 36507125afSLouis Dionne // Format the arguments into an allocated buffer for CrashReport & friends. 37507125afSLouis Dionne // We leak the buffer on purpose, since we're about to abort() anyway. 389783f28cSLouis Dionne char* buffer; 399783f28cSLouis Dionne (void)buffer; 40507125afSLouis Dionne va_list list; 41507125afSLouis Dionne va_start(list, format); 42507125afSLouis Dionne 43507125afSLouis Dionne #if defined(__APPLE__) && __has_include(<CrashReporterClient.h>) 44507125afSLouis Dionne // Note that we should technically synchronize accesses here (by e.g. taking a lock), 45507125afSLouis Dionne // however concretely we're only setting a pointer, so the likelihood of a race here 46507125afSLouis Dionne // is low. 47507125afSLouis Dionne vasprintf(&buffer, format, list); 48507125afSLouis Dionne CRSetCrashLogMessage(buffer); 49507125afSLouis Dionne #elif defined(__BIONIC__) 50507125afSLouis Dionne vasprintf(&buffer, format, list); 51507125afSLouis Dionne 52507125afSLouis Dionne // Show error in tombstone. 53507125afSLouis Dionne android_set_abort_message(buffer); 54507125afSLouis Dionne 55507125afSLouis Dionne // Show error in logcat. 56507125afSLouis Dionne openlog("libc++", 0, 0); 57507125afSLouis Dionne syslog(LOG_CRIT, "%s", buffer); 58507125afSLouis Dionne closelog(); 59507125afSLouis Dionne #endif 60507125afSLouis Dionne va_end(list); 61507125afSLouis Dionne 62507125afSLouis Dionne std::abort(); 63507125afSLouis Dionne } 64507125afSLouis Dionne 65507125afSLouis Dionne _LIBCPP_END_NAMESPACE_STD 66