Allow liblog to pass failure reasons to debuggerd.
assert(3) already does this, but LOG_ALWAYS_FATAL and LOG_ALWAYS_FATAL_IF
have been missing out.
Change-Id: I1d6214c4f792fa0d4ba3c14eded3fc9c332bd3c5
diff --git a/libc/bionic/libc_logging.cpp b/libc/bionic/libc_logging.cpp
index 8e62e40..c9c5d28 100644
--- a/libc/bionic/libc_logging.cpp
+++ b/libc/bionic/libc_logging.cpp
@@ -614,7 +614,7 @@
__libc_fatal("FORTIFY_SOURCE: %s. Calling abort().", msg);
}
-static void __libc_fatal(const char* format, va_list args) {
+static void __libc_fatal(const char* tag, const char* format, va_list args) {
char msg[1024];
BufferOutputStream os(msg, sizeof(msg));
out_vformat(os, format, args);
@@ -622,7 +622,7 @@
// TODO: log to stderr for the benefit of "adb shell" users.
// Log to the log for the benefit of regular app developers (whose stdout and stderr are closed).
- __libc_write_log(ANDROID_LOG_FATAL, "libc", msg);
+ __libc_write_log(ANDROID_LOG_FATAL, tag, msg);
__libc_set_abort_message(msg);
}
@@ -630,14 +630,23 @@
void __libc_fatal_no_abort(const char* format, ...) {
va_list args;
va_start(args, format);
- __libc_fatal(format, args);
+ __libc_fatal("libc", format, args);
va_end(args);
}
void __libc_fatal(const char* format, ...) {
va_list args;
va_start(args, format);
- __libc_fatal(format, args);
+ __libc_fatal("libc", format, args);
+ va_end(args);
+ abort();
+}
+
+// This is used by liblog to implement LOG_ALWAYS_FATAL and LOG_ALWAYS_FATAL_IF.
+void __android_fatal(const char* tag, const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ __libc_fatal(tag, format, args);
va_end(args);
abort();
}
diff --git a/libc/private/libc_logging.h b/libc/private/libc_logging.h
index a187b37..54e050a 100644
--- a/libc/private/libc_logging.h
+++ b/libc/private/libc_logging.h
@@ -74,8 +74,8 @@
// Formats a message to the log (priority 'fatal'), then aborts.
//
-__LIBC_HIDDEN__ __noreturn void __libc_fatal(const char* format, ...)
- __printflike(1, 2);
+__LIBC_HIDDEN__ __noreturn void __libc_fatal(const char* format, ...) __printflike(1, 2);
+__noreturn void __android_fatal(const char* tag, const char* format, ...) __printflike(2, 3);
//
// Formats a message to the log (priority 'fatal'), but doesn't abort.