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

Commit 95c77707 authored by Christopher Ferris's avatar Christopher Ferris Committed by Gerrit Code Review
Browse files

Merge "Update for accurate unreadable elf files."

parents 00e57e08 c95047dd
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1825,9 +1825,9 @@ static bool CopySharedLibrary(const char* tmp_dir, std::string* tmp_so_name) {
TEST_F(CrasherTest, unreadable_elf) {
  int intercept_result;
  unique_fd output_fd;
  StartProcess([]() {
    TemporaryDir td;
  std::string tmp_so_name;
  StartProcess([&tmp_so_name]() {
    TemporaryDir td;
    if (!CopySharedLibrary(td.path, &tmp_so_name)) {
      _exit(1);
    }
@@ -1857,6 +1857,8 @@ TEST_F(CrasherTest, unreadable_elf) {
  std::string result;
  ConsumeFd(std::move(output_fd), &result);
  ASSERT_MATCH(result, R"(NOTE: Function names and BuildId information is missing )");
  std::string match_str = "NOTE:   " + tmp_so_name;
  ASSERT_MATCH(result, match_str);
}

TEST(tombstoned, proto) {
+18 −6
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@

#include <memory>
#include <optional>
#include <set>
#include <string>

#include <async_safe/log.h>
@@ -419,18 +420,29 @@ static void dump_thread_backtrace(unwindstack::Unwinder* unwinder, Thread& threa
    return;
  }

  if (unwinder->elf_from_memory_not_file()) {
  unwinder->SetDisplayBuildID(true);
  std::set<std::string> unreadable_elf_files;
  for (const auto& frame : unwinder->frames()) {
    BacktraceFrame* f = thread.add_current_backtrace();
    fill_in_backtrace_frame(f, frame);
    if (frame.map_info != nullptr && frame.map_info->ElfFileNotReadable()) {
      unreadable_elf_files.emplace(frame.map_info->name());
    }
  }

  if (!unreadable_elf_files.empty()) {
    auto unreadable_elf_files_proto = thread.mutable_unreadable_elf_files();
    auto backtrace_note = thread.mutable_backtrace_note();
    *backtrace_note->Add() =
        "Function names and BuildId information is missing for some frames due";
    *backtrace_note->Add() = "to unreadable libraries. For unwinds of apps, only shared libraries";
    *backtrace_note->Add() = "found under the lib/ directory are readable.";
    *backtrace_note->Add() = "On this device, run setenforce 0 to make the libraries readable.";
    *backtrace_note->Add() = "Unreadable libraries:";
    for (auto& name : unreadable_elf_files) {
      *backtrace_note->Add() = "  " + name;
      *unreadable_elf_files_proto->Add() = name;
    }
  unwinder->SetDisplayBuildID(true);
  for (const auto& frame : unwinder->frames()) {
    BacktraceFrame* f = thread.add_current_backtrace();
    fill_in_backtrace_frame(f, frame);
  }
}

+17 −4
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <sys/wait.h>
#include <unistd.h>

#include <set>
#include <string>

#include <android-base/properties.h>
@@ -483,7 +484,16 @@ std::string describe_pac_enabled_keys(long value) {
}

void log_backtrace(log_t* log, unwindstack::Unwinder* unwinder, const char* prefix) {
  if (unwinder->elf_from_memory_not_file()) {
  std::set<std::string> unreadable_elf_files;
  unwinder->SetDisplayBuildID(true);
  for (const auto& frame : unwinder->frames()) {
    if (frame.map_info != nullptr && frame.map_info->ElfFileNotReadable()) {
      unreadable_elf_files.emplace(frame.map_info->name());
    }
  }

  // Put the preamble ahead of the backtrace.
  if (!unreadable_elf_files.empty()) {
    _LOG(log, logtype::BACKTRACE,
         "%sNOTE: Function names and BuildId information is missing for some frames due\n", prefix);
    _LOG(log, logtype::BACKTRACE,
@@ -493,10 +503,13 @@ void log_backtrace(log_t* log, unwindstack::Unwinder* unwinder, const char* pref
    _LOG(log, logtype::BACKTRACE,
         "%sNOTE: On this device, run setenforce 0 to make the libraries readable.\n", prefix);
#endif
    _LOG(log, logtype::BACKTRACE, "%sNOTE: Unreadable libraries:\n", prefix);
    for (auto& name : unreadable_elf_files) {
      _LOG(log, logtype::BACKTRACE, "%sNOTE:   %s\n", prefix, name.c_str());
    }
  }

  unwinder->SetDisplayBuildID(true);
  for (size_t i = 0; i < unwinder->NumFrames(); i++) {
    _LOG(log, logtype::BACKTRACE, "%s%s\n", prefix, unwinder->FormatFrame(i).c_str());
  for (const auto& frame : unwinder->frames()) {
    _LOG(log, logtype::BACKTRACE, "%s%s\n", prefix, unwinder->FormatFrame(frame).c_str());
  }
}
+2 −1
Original line number Diff line number Diff line
@@ -123,12 +123,13 @@ message Thread {
  string name = 2;
  repeated Register registers = 3;
  repeated string backtrace_note = 7;
  repeated string unreadable_elf_files = 9;
  repeated BacktraceFrame current_backtrace = 4;
  repeated MemoryDump memory_dump = 5;
  int64 tagged_addr_ctrl = 6;
  int64 pac_enabled_keys = 8;

  reserved 9 to 999;
  reserved 10 to 999;
}

message BacktraceFrame {