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

Commit 618cea3e authored by Josh Gao's avatar Josh Gao
Browse files

Remove use of libbase logging in libdebuggerd.

libbase logging uses getprogname() to get the default tag, which breaks
for the fallback handler which is statically linked into the dynamic
linker. Switch to libasync_safe for logging.

Test: atest -c CtsSeccompHostTestCases:android.seccomp.cts.SeccompHostJUnit4DeviceTest#testAppZygoteSyscalls
Change-Id: Ieeaf33fb26cff4ba7e1589d1d883ac2fcc74cf47
parent 76e1e30f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ cc_library_static {
    ],

    whole_static_libs: [
        "libasync_safe",
        "gwp_asan_crash_handler",
        "libscudo",
        "libtombstone_proto",
+8 −5
Original line number Diff line number Diff line
@@ -36,12 +36,12 @@
#include <string>

#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
#include <android/log.h>
#include <async_safe/log.h>
#include <log/log.h>
#include <log/log_read.h>
#include <log/logprint.h>
@@ -588,7 +588,7 @@ void engrave_tombstone_ucontext(int tombstone_fd, int proto_fd, uint64_t abort_m

  unwindstack::UnwinderFromPid unwinder(kMaxFrames, pid, unwindstack::Regs::CurrentArch());
  if (!unwinder.Init()) {
    LOG(FATAL) << "Failed to init unwinder object.";
    async_safe_fatal("failed to init unwinder object");
  }

  ProcessInfo process_info;
@@ -606,8 +606,11 @@ void engrave_tombstone(unique_fd output_fd, unique_fd proto_fd, unwindstack::Unw
  Tombstone tombstone;
  engrave_tombstone_proto(&tombstone, unwinder, threads, target_thread, process_info, open_files);

  if (proto_fd != -1) {
    if (!tombstone.SerializeToFileDescriptor(proto_fd.get())) {
    PLOG(ERROR) << "Failed to write proto tombstone";
      async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "failed to write proto tombstone: %s",
                            strerror(errno));
    }
  }

  log_t log;
@@ -631,7 +634,7 @@ void engrave_tombstone(unique_fd output_fd, unique_fd proto_fd, unwindstack::Unw

    auto it = threads.find(target_thread);
    if (it == threads.end()) {
      LOG(FATAL) << "failed to find target thread";
      async_safe_fatal("failed to find target thread");
    }

    dump_thread(&log, unwinder, it->second, process_info, true);
+21 −11
Original line number Diff line number Diff line
@@ -31,7 +31,8 @@
#include <memory>
#include <string>

#include <android-base/logging.h>
#include <async_safe/log.h>

#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
@@ -151,13 +152,15 @@ static void dump_abort_message(Tombstone* tombstone, unwindstack::Unwinder* unwi

  size_t length;
  if (!process_memory->ReadFully(address, &length, sizeof(length))) {
    PLOG(ERROR) << "Failed to read abort message header";
    async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "failed to read abort message header: %s",
                          strerror(errno));
    return;
  }

  // The length field includes the length of the length field itself.
  if (length < sizeof(size_t)) {
    LOG(ERROR) << "Abort message header malformed: claimed length = " << length;
    async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG,
                          "abort message header malformed: claimed length = %zu", length);
    return;
  }

@@ -168,7 +171,8 @@ static void dump_abort_message(Tombstone* tombstone, unwindstack::Unwinder* unwi
  msg.resize(length);

  if (!process_memory->ReadFully(address + sizeof(length), &msg[0], length)) {
    PLOG(ERROR) << "Failed to read abort message header";
    async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "failed to read abort message header: %s",
                          strerror(errno));
    return;
  }

@@ -236,7 +240,11 @@ static void dump_thread(Tombstone* tombstone, unwindstack::Unwinder* unwinder,

          dump.set_begin_address(value);

          CHECK(start_offset + bytes <= sizeof(buf));
          if (start_offset + bytes > sizeof(buf)) {
            async_safe_fatal("dump_memory overflowed? start offset = %zu, bytes read = %zd",
                             start_offset, bytes);
          }

          dump.set_memory(buf, start_offset + bytes);

          *thread.add_memory_dump() = std::move(dump);
@@ -247,10 +255,12 @@ static void dump_thread(Tombstone* tombstone, unwindstack::Unwinder* unwinder,
  unwinder->SetRegs(regs_copy.get());
  unwinder->Unwind();
  if (unwinder->NumFrames() == 0) {
    LOG(ERROR) << "Failed to unwind";
    async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "failed to unwind");
    if (unwinder->LastErrorCode() != unwindstack::ERROR_NONE) {
      LOG(ERROR) << "  Error code: " << unwinder->LastErrorCodeString();
      LOG(ERROR) << "  Error address: " << StringPrintf("0x%" PRIx64, unwinder->LastErrorAddress());
      async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "  error code: %s",
                            unwinder->LastErrorCodeString());
      async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "  error address: 0x%" PRIx64,
                            unwinder->LastErrorAddress());
    }
  } else {
    unwinder->SetDisplayBuildID(true);
@@ -351,11 +361,9 @@ static void dump_log_file(Tombstone* tombstone, const char* logger, pid_t pid) {
        // non-blocking EOF; we're done
        break;
      } else {
        ALOGE("Error while reading log: %s\n", strerror(-actual));
        break;
      }
    } else if (actual == 0) {
      ALOGE("Got zero bytes while reading log: %s\n", strerror(errno));
      break;
    }

@@ -431,7 +439,9 @@ void engrave_tombstone_proto(Tombstone* tombstone, unwindstack::Unwinder* unwind
  result.set_selinux_label(main_thread.selinux_label);

  result.set_process_name(main_thread.process_name);
  CHECK(main_thread.siginfo != nullptr);
  if (!main_thread.siginfo) {
    async_safe_fatal("siginfo missing");
  }

  Signal sig;
  sig.set_number(main_thread.signo);
+3 −4
Original line number Diff line number Diff line
@@ -25,9 +25,9 @@
#include <utility>
#include <vector>

#include <android-base/logging.h>
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
#include <async_safe/log.h>

#include "tombstone.pb.h"

@@ -113,7 +113,7 @@ static void print_thread_registers(CallbackType callback, const Tombstone& tombs
      break;

    default:
      LOG(FATAL) << "unknown architecture";
      async_safe_fatal("unknown architecture");
  }

  for (const auto& reg : thread.registers()) {
@@ -217,7 +217,6 @@ static void print_main_thread(CallbackType callback, const Tombstone& tombstone,
  }

  if (!tombstone.has_signal_info()) {
    LOG(ERROR) << "signal info missing in tombstone";
    CBL("signal information missing");
  } else {
    std::string fault_addr_desc;
@@ -319,7 +318,7 @@ bool tombstone_proto_to_text(const Tombstone& tombstone, CallbackType callback)
  const auto& threads = tombstone.threads();
  auto main_thread_it = threads.find(tombstone.tid());
  if (main_thread_it == threads.end()) {
    LOG(ERROR) << "failed to find entry for main thread in tombstone";
    CBL("failed to find entry for main thread in tombstone");
    return false;
  }

+3 −3
Original line number Diff line number Diff line
@@ -30,11 +30,11 @@

#include <string>

#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
#include <async_safe/log.h>
#include <bionic/reserved_signals.h>
#include <debuggerd/handler.h>
#include <log/log.h>
@@ -259,11 +259,11 @@ void drop_capabilities() {
  memset(&capdata, 0, sizeof(capdata));

  if (capset(&capheader, &capdata[0]) == -1) {
    PLOG(FATAL) << "failed to drop capabilities";
    async_safe_fatal("failed to drop capabilities: %s", strerror(errno));
  }

  if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) != 0) {
    PLOG(FATAL) << "failed to set PR_SET_NO_NEW_PRIVS";
    async_safe_fatal("failed to set PR_SET_NO_NEW_PRIVS: %s", strerror(errno));
  }
}