Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6798914b authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Improve liblog's fatal logging."

parents 0607e104 da6b2e2f
Loading
Loading
Loading
Loading
+28 −21
Original line number Diff line number Diff line

//#include <cutils/misc.h>

#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sched.h>
#include <errno.h>

#include <signal.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>

#include <pthread.h>

#include <cutils/log.h>
#include <cutils/sockets.h>

extern const char* __progname;
@@ -23,7 +20,7 @@ void crash1(void);
void crashnostack(void);
static int do_action(const char* arg);

static void maybeabort() {
static void maybe_abort() {
    if (time(0) != 42) {
        abort();
    }
@@ -132,7 +129,15 @@ static int do_action(const char* arg)
    } else if (!strcmp(arg, "crash")) {
        return crash(42);
    } else if (!strcmp(arg, "abort")) {
        maybeabort();
        maybe_abort();
    } else if (!strcmp(arg, "assert")) {
        __assert("some_file.c", 123, "false");
    } else if (!strcmp(arg, "assert2")) {
      __assert2("some_file.c", 123, "some_function", "false");
    } else if (!strcmp(arg, "LOG_ALWAYS_FATAL")) {
        LOG_ALWAYS_FATAL("hello %s", "world");
    } else if (!strcmp(arg, "LOG_ALWAYS_FATAL_IF")) {
        LOG_ALWAYS_FATAL_IF(true, "hello %s", "world");
    } else if (!strcmp(arg, "heap-usage")) {
        abuse_heap();
    }
@@ -148,6 +153,8 @@ static int do_action(const char* arg)
    fprintf(stderr, "  exit            call exit(1)\n");
    fprintf(stderr, "  crash           cause a SIGSEGV\n");
    fprintf(stderr, "  abort           call abort()\n");
    fprintf(stderr, "  assert          call assert() without a function\n");
    fprintf(stderr, "  assert2         call assert() with a function\n");
    fprintf(stderr, "prefix any of the above with 'thread-' to not run\n");
    fprintf(stderr, "on the process' main thread.\n");
    return EXIT_SUCCESS;
+3 −3
Original line number Diff line number Diff line
@@ -110,8 +110,8 @@ int __android_log_vprint(int prio, const char *tag,
                         const char *fmt, va_list ap);

/*
 * Log an assertion failure and SIGTRAP the process to have a chance
 * to inspect it, if a debugger is attached. This uses the FATAL priority.
 * Log an assertion failure and abort the process to have a chance
 * to inspect it if a debugger is attached. This uses the FATAL priority.
 */
void __android_log_assert(const char *cond, const char *tag,
                          const char *fmt, ...)
+7 −1
Original line number Diff line number Diff line
@@ -407,9 +407,15 @@ void __android_log_assert(const char *cond, const char *tag,
            strcpy(buf, "Unspecified assertion failed");
    }

#if __BIONIC__
    // Ensure debuggerd gets to see what went wrong by keeping the C library in the loop.
    extern __noreturn void __android_fatal(const char* tag, const char* format, ...) __printflike(2, 3);
    __android_fatal(tag ? tag : "", "%s", buf);
#else
    __android_log_write(ANDROID_LOG_FATAL, tag, buf);

    __builtin_trap(); /* trap so we have a chance to debug the situation */
#endif
    /* NOTREACHED */
}

int __android_log_bwrite(int32_t tag, const void *payload, size_t len)
+7 −1
Original line number Diff line number Diff line
@@ -272,9 +272,15 @@ void __android_log_assert(const char *cond, const char *tag,
            strcpy(buf, "Unspecified assertion failed");
    }

#if __BIONIC__
    // Ensure debuggerd gets to see what went wrong by keeping the C library in the loop.
    extern __noreturn void __android_fatal(const char* tag, const char* format, ...) __printflike(2, 3);
    __android_fatal(tag ? tag : "", "%s", buf);
#else
    __android_log_write(ANDROID_LOG_FATAL, tag, buf);

    __builtin_trap(); /* trap so we have a chance to debug the situation */
#endif
    /* NOTREACHED */
}

int __android_log_bwrite(int32_t tag, const void *payload, size_t len)