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

Commit b31528e9 authored by Christopher Ferris's avatar Christopher Ferris Committed by Android Git Automerger
Browse files

am 06b308be: am 884f1942: Merge "Do not dump maps/memory/code of sibling threads."

* commit '06b308be':
  Do not dump maps/memory/code of sibling threads.
parents d9c52639 06b308be
Loading
Loading
Loading
Loading
+39 −43
Original line number Original line Diff line number Diff line
@@ -242,11 +242,9 @@ static void dump_stack_segment(


    backtrace_map_t map;
    backtrace_map_t map;
    backtrace->FillInMap(stack_content, &map);
    backtrace->FillInMap(stack_content, &map);
    const char* map_name;
    std::string map_name;
    if (BacktraceMap::IsValid(map)) {
    if (BacktraceMap::IsValid(map) && map.name.length() > 0) {
      map_name = "";
      map_name = "  " + map.name;
    } else {
      map_name = map.name.c_str();
    }
    }
    uintptr_t offset = 0;
    uintptr_t offset = 0;
    std::string func_name(backtrace->GetFunctionName(stack_content, &offset));
    std::string func_name(backtrace->GetFunctionName(stack_content, &offset));
@@ -254,27 +252,27 @@ static void dump_stack_segment(
      if (!i && label >= 0) {
      if (!i && label >= 0) {
        if (offset) {
        if (offset) {
          _LOG(log, logtype::STACK, "    #%02d  %" PRIPTR "  %" PRIPTR "%s (%s+%" PRIuPTR ")\n",
          _LOG(log, logtype::STACK, "    #%02d  %" PRIPTR "  %" PRIPTR "%s (%s+%" PRIuPTR ")\n",
               label, *sp, stack_content, map_name, func_name.c_str(), offset);
               label, *sp, stack_content, map_name.c_str(), func_name.c_str(), offset);
        } else {
        } else {
          _LOG(log, logtype::STACK, "    #%02d  %" PRIPTR "  %" PRIPTR "%s (%s)\n",
          _LOG(log, logtype::STACK, "    #%02d  %" PRIPTR "  %" PRIPTR "%s (%s)\n",
               label, *sp, stack_content, map_name, func_name.c_str());
               label, *sp, stack_content, map_name.c_str(), func_name.c_str());
        }
        }
      } else {
      } else {
        if (offset) {
        if (offset) {
          _LOG(log, logtype::STACK, "         %" PRIPTR "  %" PRIPTR "%s (%s+%" PRIuPTR ")\n",
          _LOG(log, logtype::STACK, "         %" PRIPTR "  %" PRIPTR "%s (%s+%" PRIuPTR ")\n",
               *sp, stack_content, map_name, func_name.c_str(), offset);
               *sp, stack_content, map_name.c_str(), func_name.c_str(), offset);
        } else {
        } else {
          _LOG(log, logtype::STACK, "         %" PRIPTR "  %" PRIPTR "%s (%s)\n",
          _LOG(log, logtype::STACK, "         %" PRIPTR "  %" PRIPTR "%s (%s)\n",
               *sp, stack_content, map_name, func_name.c_str());
               *sp, stack_content, map_name.c_str(), func_name.c_str());
        }
        }
      }
      }
    } else {
    } else {
      if (!i && label >= 0) {
      if (!i && label >= 0) {
        _LOG(log, logtype::STACK, "    #%02d  %" PRIPTR "  %" PRIPTR "%s\n",
        _LOG(log, logtype::STACK, "    #%02d  %" PRIPTR "  %" PRIPTR "%s\n",
             label, *sp, stack_content, map_name);
             label, *sp, stack_content, map_name.c_str());
      } else {
      } else {
        _LOG(log, logtype::STACK, "         %" PRIPTR "  %" PRIPTR "%s\n",
        _LOG(log, logtype::STACK, "         %" PRIPTR "  %" PRIPTR "%s\n",
             *sp, stack_content, map_name);
             *sp, stack_content, map_name.c_str());
      }
      }
    }
    }


@@ -327,35 +325,27 @@ static void dump_stack(Backtrace* backtrace, log_t* log) {
  }
  }
}
}


static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) {
  if (backtrace->NumFrames()) {
    _LOG(log, logtype::BACKTRACE, "\nbacktrace:\n");
    dump_backtrace_to_log(backtrace, log, "    ");

    _LOG(log, logtype::STACK, "\nstack:\n");
    dump_stack(backtrace, log);
  }
}

static void dump_map(log_t* log, const backtrace_map_t* map, bool fault_addr) {
static void dump_map(log_t* log, const backtrace_map_t* map, bool fault_addr) {
  _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c  %7" PRIdPTR "%s\n",
  _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c  %7" PRIdPTR "%s\n",
         (fault_addr? "--->" : "    "), map->start, map->end - 1,
         (fault_addr? "--->" : "    "), map->start, map->end - 1,
         (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-',
         (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-',
         (map->flags & PROT_EXEC) ? 'x' : '-',
         (map->flags & PROT_EXEC) ? 'x' : '-',
         (map->end - map->start), map->name.c_str());
         (map->end - map->start),
         (map->name.length() > 0) ? ("  " + map->name).c_str() : "");
}
}


static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) {
static void dump_all_maps(BacktraceMap* map, log_t* log, pid_t tid) {
  bool has_fault_address = false;
  uintptr_t addr = 0;
  siginfo_t si;
  siginfo_t si;
  memset(&si, 0, sizeof(si));
  memset(&si, 0, sizeof(si));
  if (ptrace(PTRACE_GETSIGINFO, tid, 0, &si)) {
  if (ptrace(PTRACE_GETSIGINFO, tid, 0, &si)) {
    _LOG(log, logtype::MAPS, "cannot get siginfo for %d: %s\n", tid, strerror(errno));
    _LOG(log, logtype::MAPS, "cannot get siginfo for %d: %s\n", tid, strerror(errno));
    return;
  } else {
    has_fault_address = signal_has_si_addr(si.si_signo);
    addr = reinterpret_cast<uintptr_t>(si.si_addr);
  }
  }


  bool has_fault_address = signal_has_si_addr(si.si_signo);
  uintptr_t addr = reinterpret_cast<uintptr_t>(si.si_addr);

  _LOG(log, logtype::MAPS, "\nmemory map:%s\n", has_fault_address ? " (fault address prefixed with --->)" : "");
  _LOG(log, logtype::MAPS, "\nmemory map:%s\n", has_fault_address ? " (fault address prefixed with --->)" : "");


  if (has_fault_address && (addr < map->begin()->start)) {
  if (has_fault_address && (addr < map->begin()->start)) {
@@ -376,12 +366,14 @@ static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) {
  }
  }
}
}


static void dump_thread(Backtrace* backtrace, log_t* log) {
static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) {
  dump_registers(log, backtrace->Tid());
  if (backtrace->NumFrames()) {
  dump_backtrace_and_stack(backtrace, log);
    _LOG(log, logtype::BACKTRACE, "\nbacktrace:\n");
    dump_backtrace_to_log(backtrace, log, "    ");


  dump_memory_and_code(log, backtrace->Tid());
    _LOG(log, logtype::STACK, "\nstack:\n");
  dump_nearby_maps(backtrace->GetMap(), log, backtrace->Tid());
    dump_stack(backtrace, log);
  }
}
}


// Return true if some thread is not detached cleanly
// Return true if some thread is not detached cleanly
@@ -427,9 +419,10 @@ static bool dump_sibling_thread_report(
    _LOG(log, logtype::THREAD, "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n");
    _LOG(log, logtype::THREAD, "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n");
    dump_thread_info(log, pid, new_tid);
    dump_thread_info(log, pid, new_tid);


    dump_registers(log, new_tid);
    UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, new_tid, map));
    UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, new_tid, map));
    if (backtrace->Unwind(0)) {
    if (backtrace->Unwind(0)) {
      dump_thread(backtrace.get(), log);
      dump_backtrace_and_stack(backtrace.get(), log);
    }
    }


    log->current_tid = log->crashed_tid;
    log->current_tid = log->crashed_tid;
@@ -628,10 +621,13 @@ static bool dump_crash(log_t* log, pid_t pid, pid_t tid, int signal, int si_code


  UniquePtr<BacktraceMap> map(BacktraceMap::Create(pid));
  UniquePtr<BacktraceMap> map(BacktraceMap::Create(pid));
  UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, tid, map.get()));
  UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, tid, map.get()));
  if (backtrace->Unwind(0)) {
  dump_abort_message(backtrace.get(), log, abort_msg_address);
  dump_abort_message(backtrace.get(), log, abort_msg_address);
    dump_thread(backtrace.get(), log);
  dump_registers(log, tid);
  if (backtrace->Unwind(0)) {
    dump_backtrace_and_stack(backtrace.get(), log);
  }
  }
  dump_memory_and_code(log, tid);
  dump_all_maps(map.get(), log, tid);


  if (want_logs) {
  if (want_logs) {
    dump_logs(log, pid, 5);
    dump_logs(log, pid, 5);