aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Dionne <ldionne.2@gmail.com>2022-07-28 10:25:30 -0400
committerTom Stellard <tstellar@redhat.com>2022-08-02 21:48:48 -0700
commit6ba660d17410d02f5fa71d878ac49e2fdee4169f (patch)
treee672d9d260eb4aaf80b381b80541afe4de58c739
parentc9905b8cb0139f410ce63081989a328559e11374 (diff)
[libc++] Properly log crashes with the assertion handler on older Androids
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)
-rw-r--r--libcxx/src/assert.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/libcxx/src/assert.cpp b/libcxx/src/assert.cpp
index c218645f1771..d6e96f255e35 100644
--- a/libcxx/src/assert.cpp
+++ b/libcxx/src/assert.cpp
@@ -14,9 +14,13 @@
#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);