summaryrefslogtreecommitdiffstats
path: root/debuggerd/debuggerd.c
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2013-04-04 13:52:01 -0700
committerElliott Hughes <enh@google.com>2013-04-04 13:52:01 -0700
commit707b8bbe1800dbebd932f54e86347563ee86c36e (patch)
tree7a9a3c210a329063d4d94e1160abce29ebcaaeff /debuggerd/debuggerd.c
parent02e8d73079e279fac152d1d3caf36afaeab6c5bf (diff)
downloadsystem_core-707b8bbe1800dbebd932f54e86347563ee86c36e.zip
system_core-707b8bbe1800dbebd932f54e86347563ee86c36e.tar.gz
system_core-707b8bbe1800dbebd932f54e86347563ee86c36e.tar.bz2
Modify debuggerd to cope with the abort message.
Bug: 8531731 Change-Id: I416ec1da38a8a1b0d0a582ccd7c8aaa681ed4a29
Diffstat (limited to 'debuggerd/debuggerd.c')
-rw-r--r--debuggerd/debuggerd.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/debuggerd/debuggerd.c b/debuggerd/debuggerd.c
index 55222c5..99e6f13 100644
--- a/debuggerd/debuggerd.c
+++ b/debuggerd/debuggerd.c
@@ -52,6 +52,7 @@ typedef struct {
debugger_action_t action;
pid_t pid, tid;
uid_t uid, gid;
+ uintptr_t abort_msg_address;
} debugger_request_t;
static int
@@ -207,12 +208,15 @@ static int read_request(int fd, debugger_request_t* out_request) {
}
debugger_msg_t msg;
+ memset(&msg, 0, sizeof(msg));
status = TEMP_FAILURE_RETRY(read(fd, &msg, sizeof(msg)));
if (status < 0) {
LOG("read failure? %s\n", strerror(errno));
return -1;
}
- if (status != sizeof(msg)) {
+ if (status == sizeof(debugger_msg_t)) {
+ XLOG("crash request of size %d abort_msg_address=%#08x\n", status, msg.abort_msg_address);
+ } else {
LOG("invalid crash request of size %d\n", status);
return -1;
}
@@ -222,6 +226,7 @@ static int read_request(int fd, debugger_request_t* out_request) {
out_request->pid = cr.pid;
out_request->uid = cr.uid;
out_request->gid = cr.gid;
+ out_request->abort_msg_address = msg.abort_msg_address;
if (msg.action == DEBUGGER_ACTION_CRASH) {
/* Ensure that the tid reported by the crashing process is valid. */
@@ -265,6 +270,7 @@ static void handle_request(int fd) {
XLOG("handle_request(%d)\n", fd);
debugger_request_t request;
+ memset(&request, 0, sizeof(request));
int status = read_request(fd, &request);
if (!status) {
XLOG("BOOM: pid=%d uid=%d gid=%d tid=%d\n",
@@ -308,7 +314,7 @@ static void handle_request(int fd) {
if (request.action == DEBUGGER_ACTION_DUMP_TOMBSTONE) {
XLOG("stopped -- dumping to tombstone\n");
tombstone_path = engrave_tombstone(request.pid, request.tid,
- signal, true, true, &detach_failed,
+ signal, request.abort_msg_address, true, true, &detach_failed,
&total_sleep_time_usec);
} else if (request.action == DEBUGGER_ACTION_DUMP_BACKTRACE) {
XLOG("stopped -- dumping to fd\n");
@@ -345,8 +351,8 @@ static void handle_request(int fd) {
/* don't dump sibling threads when attaching to GDB because it
* makes the process less reliable, apparently... */
tombstone_path = engrave_tombstone(request.pid, request.tid,
- signal, !attach_gdb, false, &detach_failed,
- &total_sleep_time_usec);
+ signal, request.abort_msg_address, !attach_gdb, false,
+ &detach_failed, &total_sleep_time_usec);
break;
}