debuggerd_client: increase pipe buffer size to max.
If a process tries to dump itself (e.g. system_server during ANRs), crash_dump will block trying to write to its pipe if it's not sufficiently large. Increase the pipe size to the max, and add a test to make sure that it's always at least 1MB (the default value). Bug: http://b/38427757 Test: debuggerd_test Change-Id: Iddb0cb1e5ce9e687efa9e94c2748a1edfe09f119
This commit is contained in:
parent
b0e51e388b
commit
5675f3c321
2 changed files with 18 additions and 0 deletions
|
|
@ -28,7 +28,9 @@
|
|||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/parseint.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <android-base/strings.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
#include <cutils/sockets.h>
|
||||
|
||||
|
|
@ -117,6 +119,20 @@ bool debuggerd_trigger_dump(pid_t pid, DebuggerdDumpType dump_type, unsigned int
|
|||
return false;
|
||||
}
|
||||
|
||||
std::string pipe_size_str;
|
||||
int pipe_buffer_size = 1024 * 1024;
|
||||
if (android::base::ReadFileToString("/proc/sys/fs/pipe-max-size", &pipe_size_str)) {
|
||||
pipe_size_str = android::base::Trim(pipe_size_str);
|
||||
|
||||
if (!android::base::ParseInt(pipe_size_str.c_str(), &pipe_buffer_size, 0)) {
|
||||
LOG(FATAL) << "failed to parse pipe max size '" << pipe_size_str << "'";
|
||||
}
|
||||
}
|
||||
|
||||
if (fcntl(pipe_read.get(), F_SETPIPE_SZ, pipe_buffer_size) != pipe_buffer_size) {
|
||||
PLOG(ERROR) << "failed to set pipe buffer size";
|
||||
}
|
||||
|
||||
if (send_fd(set_timeout(sockfd), &req, sizeof(req), std::move(pipe_write)) != sizeof(req)) {
|
||||
PLOG(ERROR) << "libdebuggerd_client: failed to send output fd to tombstoned";
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -119,6 +119,8 @@ static void tombstoned_intercept(pid_t target_pid, unique_fd* intercept_fd, uniq
|
|||
FAIL() << "failed to set pipe size: " << strerror(errno);
|
||||
}
|
||||
|
||||
ASSERT_GE(pipe_buffer_size, 1024 * 1024);
|
||||
|
||||
if (send_fd(intercept_fd->get(), &req, sizeof(req), std::move(output_pipe_write)) != sizeof(req)) {
|
||||
FAIL() << "failed to send output fd to tombstoned: " << strerror(errno);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue