aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2011-01-20 21:39:57 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2011-01-20 21:39:57 -0800
commit54175579333b4b95606bbdb7840bcfbea5b854ee (patch)
treee259d7324cddf635a92e68252c0b1b260ed672e0
parentc7de5e33e36143e900be4db4030e4c0ef6a51258 (diff)
parent02526d486803de153d03851f4d5f9be7c555e46c (diff)
downloadsystem_core-54175579333b4b95606bbdb7840bcfbea5b854ee.tar.gz
system_core-54175579333b4b95606bbdb7840bcfbea5b854ee.tar.bz2
system_core-54175579333b4b95606bbdb7840bcfbea5b854ee.zip
am 02526d48: debuggerd: properly unblock signal handler.
* commit '02526d486803de153d03851f4d5f9be7c555e46c': debuggerd: properly unblock signal handler.
-rw-r--r--debuggerd/debuggerd.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/debuggerd/debuggerd.c b/debuggerd/debuggerd.c
index 5fa44422..7a3e781e 100644
--- a/debuggerd/debuggerd.c
+++ b/debuggerd/debuggerd.c
@@ -642,7 +642,7 @@ static void handle_crashing_process(int fd)
goto done;
}
- sprintf(buf,"/proc/%d/task/%d", cr.pid, tid);
+ snprintf(buf, sizeof buf, "/proc/%d/task/%d", cr.pid, tid);
if(stat(buf, &s)) {
LOG("tid %d does not exist in pid %d. ignoring debug request\n",
tid, cr.pid);
@@ -652,7 +652,19 @@ static void handle_crashing_process(int fd)
XLOG("BOOM: pid=%d uid=%d gid=%d tid=%d\n", cr.pid, cr.uid, cr.gid, tid);
+ /* Note that at this point, the target thread's signal handler
+ * is blocked in a read() call. This gives us the time to PTRACE_ATTACH
+ * to it before it has a chance to really fault.
+ *
+ * After the attach, the thread is stopped, and we write to the file
+ * descriptor to ensure that it will run as soon as we call PTRACE_CONT
+ * below. See details in bionic/libc/linker/debugger.c, in function
+ * debugger_signal_handler().
+ */
tid_attach_status = ptrace(PTRACE_ATTACH, tid, 0, 0);
+
+ TEMP_FAILURE_RETRY(write(fd, &tid, 1));
+
if(tid_attach_status < 0) {
LOG("ptrace attach failed: %s\n", strerror(errno));
goto done;