summaryrefslogtreecommitdiffstats
path: root/debuggerd
diff options
context:
space:
mode:
authorJosh Gao <jmgao@google.com>2016-03-16 13:39:38 -0700
committerJosh Gao <jmgao@google.com>2016-03-16 16:10:48 -0700
commit561497c0a8073d8e04b387be0e0aa995424cee59 (patch)
treebfccb39a5f0371e3dbbb6be762a5bda2b9e3740d /debuggerd
parent42aab0a789d6d2d602165e641ddc86a0bc2458c6 (diff)
downloadcore-561497c0a8073d8e04b387be0e0aa995424cee59.tar.gz
core-561497c0a8073d8e04b387be0e0aa995424cee59.tar.bz2
core-561497c0a8073d8e04b387be0e0aa995424cee59.zip
debuggerd: kill crashing processes with the signal they died with.
Bug: http://b/27675306 Change-Id: I951c5d7e54c35d88c65c5dc856e0b9d5a93d47b2
Diffstat (limited to 'debuggerd')
-rw-r--r--debuggerd/debuggerd.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/debuggerd/debuggerd.cpp b/debuggerd/debuggerd.cpp
index b1919544e..eabbb9abf 100644
--- a/debuggerd/debuggerd.cpp
+++ b/debuggerd/debuggerd.cpp
@@ -374,7 +374,8 @@ static void ptrace_siblings(pid_t pid, pid_t main_tid, std::set<pid_t>& tids) {
}
static bool perform_dump(const debugger_request_t& request, int fd, int tombstone_fd,
- BacktraceMap* backtrace_map, const std::set<pid_t>& siblings) {
+ BacktraceMap* backtrace_map, const std::set<pid_t>& siblings,
+ int* crash_signal) {
if (TEMP_FAILURE_RETRY(write(fd, "\0", 1)) != 1) {
ALOGE("debuggerd: failed to respond to client: %s\n", strerror(errno));
return false;
@@ -420,6 +421,7 @@ static bool perform_dump(const debugger_request_t& request, int fd, int tombston
// the non-signaled threads stop moving. Without
// this we get a lot of "ptrace detach failed:
// No such process".
+ *crash_signal = signal;
kill(request.pid, SIGSTOP);
engrave_tombstone(tombstone_fd, backtrace_map, request.pid, request.tid, siblings, signal,
request.original_si_code, request.abort_msg_address);
@@ -632,7 +634,8 @@ static void handle_request(int fd) {
_exit(1);
}
- succeeded = perform_dump(request, fd, tombstone_fd, backtrace_map.get(), siblings);
+ int crash_signal = SIGKILL;
+ succeeded = perform_dump(request, fd, tombstone_fd, backtrace_map.get(), siblings, &crash_signal);
if (succeeded) {
if (request.action == DEBUGGER_ACTION_DUMP_TOMBSTONE) {
if (!tombstone_path.empty()) {
@@ -659,9 +662,7 @@ static void handle_request(int fd) {
// Send the signal back to the process if it crashed and we're not waiting for gdb.
if (!attach_gdb && request.action == DEBUGGER_ACTION_CRASH) {
- // TODO: Send the same signal that triggered the dump, so that shell says "Segmentation fault"
- // instead of "Killed"?
- if (!send_signal(SIGKILL)) {
+ if (!send_signal(crash_signal)) {
ALOGE("debuggerd: failed to kill process %d: %s", request.pid, strerror(errno));
}
}