diff options
author | Louis Dionne <ldionne.2@gmail.com> | 2022-07-28 10:25:30 -0400 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2022-08-02 21:48:48 -0700 |
commit | 6ba660d17410d02f5fa71d878ac49e2fdee4169f (patch) | |
tree | e672d9d260eb4aaf80b381b80541afe4de58c739 | |
parent | c9905b8cb0139f410ce63081989a328559e11374 (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.cpp | 18 |
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); |