brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 94bdb45 Raw
66 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include <__config>10#include <__verbose_abort>11#include <cstdarg>12#include <cstdio>13#include <cstdlib>14 15#ifdef __BIONIC__16#  include <syslog.h>17extern "C" void android_set_abort_message(const char* msg);18#endif   // __BIONIC__19 20#if defined(__APPLE__) && __has_include(<CrashReporterClient.h>)21#  include <CrashReporterClient.h>22#endif23 24_LIBCPP_BEGIN_NAMESPACE_STD25 26_LIBCPP_WEAK void __libcpp_verbose_abort(char const* format, ...) noexcept {27  // Write message to stderr. We do this before formatting into a28  // buffer so that we still get some information out if that fails.29  {30    va_list list;31    va_start(list, format);32    std::vfprintf(stderr, format, list);33    va_end(list);34  }35 36  // Format the arguments into an allocated buffer for CrashReport & friends.37  // We leak the buffer on purpose, since we're about to abort() anyway.38  char* buffer;39  (void)buffer;40  va_list list;41  va_start(list, format);42 43#if defined(__APPLE__) && __has_include(<CrashReporterClient.h>)44  // Note that we should technically synchronize accesses here (by e.g. taking a lock),45  // however concretely we're only setting a pointer, so the likelihood of a race here46  // is low.47  vasprintf(&buffer, format, list);48  CRSetCrashLogMessage(buffer);49#elif defined(__BIONIC__)50  vasprintf(&buffer, format, list);51 52  // Show error in tombstone.53  android_set_abort_message(buffer);54 55  // Show error in logcat.56  openlog("libc++", 0, 0);57  syslog(LOG_CRIT, "%s", buffer);58  closelog();59#endif60  va_end(list);61 62  std::abort();63}64 65_LIBCPP_END_NAMESPACE_STD66