OSDN Git Service

Use the timeout stack dump functions.
authorChristopher Ferris <cferris@google.com>
Wed, 14 Jan 2015 21:23:30 +0000 (13:23 -0800)
committerChristopher Ferris <cferris@google.com>
Thu, 15 Jan 2015 00:58:55 +0000 (16:58 -0800)
Use the native stack dumping functions that allows time outs. If
debuggerd locks up, before a bugreport would hang forever. Now
it will timeout properly and still get all of the other information.

Bug: 18766581
Change-Id: I85053b8dcfe6224e2b64b4d8f7f2ef448b3cda34

cmds/dumpstate/utils.c

index 81cdd12..3e0b24b 100644 (file)
@@ -619,20 +619,28 @@ const char *dump_traces() {
             if (lseek(fd, 0, SEEK_END) < 0) {
                 fprintf(stderr, "lseek: %s\n", strerror(errno));
             } else {
-                snprintf(data, sizeof(data), "[dump dalvik stack %d: %.3fs elapsed]\n",
+                dprintf(fd, "[dump dalvik stack %d: %.3fs elapsed]\n",
                         pid, (float)(nanotime() - start) / NANOS_PER_SEC);
-                write(fd, data, strlen(data));
             }
         } else if (should_dump_native_traces(data)) {
             /* dump native process if appropriate */
             if (lseek(fd, 0, SEEK_END) < 0) {
                 fprintf(stderr, "lseek: %s\n", strerror(errno));
             } else {
+                static uint16_t timeout_failures = 0;
                 int64_t start = nanotime();
-                dump_backtrace_to_file(pid, fd);
-                snprintf(data, sizeof(data), "[dump native stack %d: %.3fs elapsed]\n",
+
+                /* If 3 backtrace dumps fail in a row, consider debuggerd dead. */
+                if (timeout_failures == 3) {
+                    dprintf(fd, "too many stack dump failures, skipping...\n");
+                } else if (dump_backtrace_to_file_timeout(pid, fd, 20) == -1) {
+                    dprintf(fd, "dumping failed, likely due to a timeout\n");
+                    timeout_failures++;
+                } else {
+                    timeout_failures = 0;
+                }
+                dprintf(fd, "[dump native stack %d: %.3fs elapsed]\n",
                         pid, (float)(nanotime() - start) / NANOS_PER_SEC);
-                write(fd, data, strlen(data));
             }
         }
     }