From 6ba660d17410d02f5fa71d878ac49e2fdee4169f Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Thu, 28 Jul 2022 10:25:30 -0400 Subject: [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) --- libcxx/src/assert.cpp | 18 +++++++++++++++--- 1 file 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 -# include +# if __ANDROID_API__ >= 21 +# include extern "C" void android_set_abort_message(const char* msg); -#endif +# else +# include +# endif // __ANDROID_API__ >= 21 +#endif // __BIONIC__ #if defined(__APPLE__) && __has_include() # include @@ -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); -- cgit v1.2.3