[libc++] Properly log crashes with the assertion handler on older Androids
authorLouis Dionne <ldionne.2@gmail.com>
Thu, 28 Jul 2022 14:25:30 +0000 (10:25 -0400)
committerTom Stellard <tstellar@redhat.com>
Wed, 3 Aug 2022 04:48:48 +0000 (21:48 -0700)
This reintroduces the same workaround we have in libc++abi for older
Androids based on https://reviews.llvm.org/D130507#inline-1255914.

Differential Revision: https://reviews.llvm.org/D130708

(cherry picked from commit 1422a9689d7907a4561da7b906ec392840d9e635)

libcxx/src/assert.cpp

index c218645..d6e96f2 100644 (file)
 
 #ifdef __BIONIC__
 #  include <android/api-level.h>
-#  include <syslog.h>
+#  if __ANDROID_API__ >= 21
+#    include <syslog.h>
 extern "C" void android_set_abort_message(const char* msg);
-#endif
+#  else
+#    include <assert.h>
+#  endif // __ANDROID_API__ >= 21
+#endif   // __BIONIC__
 
 #if defined(__APPLE__) && __has_include(<CrashReporterClient.h>)
 #  include <CrashReporterClient.h>
@@ -48,14 +52,22 @@ void __libcpp_assertion_handler(char const* format, ...) {
   vasprintf(&buffer, format, list);
   CRSetCrashLogMessage(buffer);
 #elif defined(__BIONIC__)
-  // Show error in tombstone.
   vasprintf(&buffer, format, list);
+
+#  if __ANDROID_API__ >= 21
+  // Show error in tombstone.
   android_set_abort_message(buffer);
 
   // Show error in logcat.
   openlog("libc++", 0, 0);
   syslog(LOG_CRIT, "%s", buffer);
   closelog();
+#  else
+  // The good error reporting wasn't available in Android until L. Since we're
+  // about to abort anyway, just call __assert2, which will log _somewhere_
+  // (tombstone and/or logcat) in older releases.
+  __assert2(__FILE__, __LINE__, __func__, buffer);
+#  endif // __ANDROID_API__ >= 21
 #endif
   va_end(list);