Merge "Revert "crash_dump: defer pausing threads until we're ready.""

This commit is contained in:
Josh Gao 2017-06-13 18:21:58 +00:00 committed by Gerrit Code Review
commit 550f3bf328
2 changed files with 27 additions and 32 deletions

View File

@ -7,7 +7,6 @@ cc_defaults {
"-Wno-nullability-completeness",
"-Os",
],
cpp_std: "experimental",
local_include_dirs: ["include"],
}

View File

@ -95,6 +95,11 @@ static bool ptrace_seize_thread(int pid_proc_fd, pid_t tid, std::string* error)
return false;
}
// Put the task into ptrace-stop state.
if (ptrace(PTRACE_INTERRUPT, tid, 0, 0) != 0) {
PLOG(FATAL) << "failed to interrupt thread " << tid;
}
return true;
}
@ -279,38 +284,36 @@ int main(int argc, char** argv) {
// Die if we take too long.
alarm(2);
std::string process_name = get_process_name(main_tid);
std::string attach_error;
std::map<pid_t, std::string> threads;
{
ATRACE_NAME("ptrace_interrupt");
ATRACE_NAME("ptrace");
// Seize the main thread.
if (!ptrace_seize_thread(target_proc_fd, main_tid, &attach_error)) {
LOG(FATAL) << attach_error;
}
threads.emplace(main_tid, get_thread_name(main_tid));
// Seize its siblings.
std::set<pid_t> siblings;
if (!android::procinfo::GetProcessTids(target, &siblings)) {
PLOG(FATAL) << "failed to get process siblings";
}
// but not the already attached main thread.
siblings.erase(main_tid);
// or the handler pseudothread.
siblings.erase(pseudothread_tid);
for (pid_t sibling_tid : siblings) {
if (!ptrace_seize_thread(target_proc_fd, sibling_tid, &attach_error)) {
LOG(WARNING) << attach_error;
continue;
// Seize the siblings.
{
std::set<pid_t> siblings;
if (!android::procinfo::GetProcessTids(target, &siblings)) {
PLOG(FATAL) << "failed to get process siblings";
}
// but not the already attached main thread.
siblings.erase(main_tid);
// or the handler pseudothread.
siblings.erase(pseudothread_tid);
for (pid_t sibling_tid : siblings) {
if (!ptrace_seize_thread(target_proc_fd, sibling_tid, &attach_error)) {
LOG(WARNING) << attach_error;
} else {
threads.emplace(sibling_tid, get_thread_name(sibling_tid));
}
}
threads.emplace(sibling_tid, get_thread_name(sibling_tid));
}
}
@ -331,6 +334,9 @@ int main(int argc, char** argv) {
populate_open_files_list(target, &open_files);
}
std::string process_name = get_process_name(main_tid);
threads.emplace(main_tid, get_thread_name(main_tid));
// Drop our capabilities now that we've attached to the threads we care about.
drop_capabilities();
@ -341,16 +347,6 @@ int main(int argc, char** argv) {
tombstoned_connected = tombstoned_connect(target, &tombstoned_socket, &output_fd, dump_type_enum);
}
// Pause the threads.
{
ATRACE_NAME("ptrace_interrupt");
for (const auto& [sibling_tid, _] : threads) {
if (ptrace(PTRACE_INTERRUPT, sibling_tid, 0, 0) != 0) {
PLOG(FATAL) << "failed to interrupt thread " << sibling_tid;
}
}
}
// Write a '\1' to stdout to tell the crashing process to resume.
// It also restores the value of PR_SET_DUMPABLE at this point.
if (TEMP_FAILURE_RETRY(write(STDOUT_FILENO, "\1", 1)) == -1) {