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

Commit 31ef8552 authored by Christopher Ferris's avatar Christopher Ferris
Browse files

Use the timeout stack dump functions.

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

(cherry picked from commit 457731f6)

Change-Id: I39e8e9c60209e3ef9efac795fedb8e1edce2bd3e
parent 4df903db
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -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));
            }
        }
    }