Merge "debuggerd: simplify output handling"
This commit is contained in:
commit
34de747570
|
@ -276,6 +276,13 @@ bool debuggerd_trigger_dump(pid_t tid, DebuggerdDumpType dump_type, unsigned int
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WARNING: It's not possible to replace the below with a splice call.
|
||||||
|
// Due to the way debuggerd does many small writes across the pipe,
|
||||||
|
// this would cause splice to copy a page for each write. The second
|
||||||
|
// pipe fills up based on the number of pages being copied, even
|
||||||
|
// though there is not much data being transferred per page. When
|
||||||
|
// the second pipe is full, everything stops since there is nothing
|
||||||
|
// reading the second pipe to clear it.
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
rc = TEMP_FAILURE_RETRY(read(pipe_read.get(), buf, sizeof(buf)));
|
rc = TEMP_FAILURE_RETRY(read(pipe_read.get(), buf, sizeof(buf)));
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
|
|
|
@ -41,22 +41,6 @@ static void usage(int exit_code) {
|
||||||
_exit(exit_code);
|
_exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::thread spawn_redirect_thread(unique_fd fd) {
|
|
||||||
return std::thread([fd{ std::move(fd) }]() {
|
|
||||||
while (true) {
|
|
||||||
char buf[BUFSIZ];
|
|
||||||
ssize_t rc = TEMP_FAILURE_RETRY(read(fd.get(), buf, sizeof(buf)));
|
|
||||||
if (rc <= 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!android::base::WriteFully(STDOUT_FILENO, buf, rc)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
if (argc <= 1) usage(0);
|
if (argc <= 1) usage(0);
|
||||||
if (argc > 3) usage(1);
|
if (argc > 3) usage(1);
|
||||||
|
@ -107,14 +91,11 @@ int main(int argc, char* argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_fd piperead, pipewrite;
|
unique_fd output_fd(fcntl(STDOUT_FILENO, F_DUPFD_CLOEXEC, 0));
|
||||||
if (!Pipe(&piperead, &pipewrite)) {
|
if (output_fd.get() == -1) {
|
||||||
err(1, "failed to create pipe");
|
err(1, "failed to fcntl dup stdout");
|
||||||
}
|
}
|
||||||
|
if (!debuggerd_trigger_dump(proc_info.pid, dump_type, 0, std::move(output_fd))) {
|
||||||
std::thread redirect_thread = spawn_redirect_thread(std::move(piperead));
|
|
||||||
if (!debuggerd_trigger_dump(proc_info.pid, dump_type, 0, std::move(pipewrite))) {
|
|
||||||
redirect_thread.join();
|
|
||||||
if (pid == proc_info.pid) {
|
if (pid == proc_info.pid) {
|
||||||
errx(1, "failed to dump process %d", pid);
|
errx(1, "failed to dump process %d", pid);
|
||||||
} else {
|
} else {
|
||||||
|
@ -122,6 +103,5 @@ int main(int argc, char* argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
redirect_thread.join();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue