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

Commit bc8433d5 authored by Josh Gao's avatar Josh Gao Committed by Gerrit Code Review
Browse files

Merge changes I7d394c66,I737d66e8

* changes:
  crash_dump: improve logging for when a process dies prematurely.
  debuggerd_handler: restore errno.
parents 75b66a6f 428daafc
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -148,7 +148,12 @@ static void abort_handler(pid_t target, const bool& tombstoned_connected,
    }
  }

  dprintf(output_fd.get(), "crash_dump failed to dump process %d: %s\n", target, abort_msg);
  dprintf(output_fd.get(), "crash_dump failed to dump process");
  if (target != 1) {
    dprintf(output_fd.get(), " %d: %s\n", target, abort_msg);
  } else {
    dprintf(output_fd.get(), ": %s\n", abort_msg);
  }

  _exit(1);
}
@@ -195,7 +200,7 @@ int main(int argc, char** argv) {
  pid_t pseudothread_tid;

  if (target == 1) {
    LOG(FATAL) << "target died before we could attach";
    LOG(FATAL) << "target died before we could attach (received main tid = " << main_tid << ")";
  }

  if (!android::base::ParseInt(argv[1], &main_tid, 1, std::numeric_limits<pid_t>::max())) {
+17 −0
Original line number Diff line number Diff line
@@ -62,6 +62,19 @@

#define CRASH_DUMP_PATH "/system/bin/" CRASH_DUMP_NAME

class ErrnoRestorer {
 public:
  ErrnoRestorer() : saved_errno_(errno) {
  }

  ~ErrnoRestorer() {
    errno = saved_errno_;
  }

 private:
  int saved_errno_;
};

extern "C" void debuggerd_fallback_handler(siginfo_t*, ucontext_t*, void*);

static debuggerd_callbacks_t g_callbacks;
@@ -328,6 +341,10 @@ static void resend_signal(siginfo_t* info, bool crash_dump_started) {
// Handler that does crash dumping by forking and doing the processing in the child.
// Do this by ptracing the relevant thread, and then execing debuggerd to do the actual dump.
static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void* context) {
  // Make sure we don't change the value of errno, in case a signal comes in between the process
  // making a syscall and checking errno.
  ErrnoRestorer restorer;

  // It's possible somebody cleared the SA_SIGINFO flag, which would mean
  // our "info" arg holds an undefined value.
  if (!have_siginfo(signal_number)) {