Small debuggerd improvements.

Include the ABI in seccomp causes.

Slightly improved command-line usage information.

Fix crasher for seccomp failures.

Bug: N/A
Test: crasher
Change-Id: Ie419ecfe72ee4f5ccf49c927be18350a58a66a90
This commit is contained in:
Elliott Hughes 2017-03-02 19:01:20 -08:00
parent 22cc398d76
commit 12b7129406
4 changed files with 12 additions and 4 deletions

View file

@ -48,6 +48,7 @@ cc_binary {
shared_libs: [
"libbase",
"liblog",
"libseccomp_policy",
],
multilib: {
lib32: {
@ -69,6 +70,7 @@ cc_binary {
"libdebuggerd_handler",
"libbase",
"liblog",
"libseccomp_policy",
],
multilib: {
lib32: {

View file

@ -33,6 +33,8 @@
#include <android-base/logging.h>
#include <log/log.h>
#include "seccomp_policy.h"
#if defined(STATIC_CRASHER)
#include "debuggerd/handler.h"
#endif
@ -269,6 +271,7 @@ noinline int do_action(const char* arg) {
munmap(map, sizeof(int));
map[0] = '8';
} else if (!strcasecmp(arg, "seccomp")) {
set_seccomp_filter();
syscall(99999);
#if defined(__arm__)
} else if (!strcasecmp(arg, "kuser_helper_version")) {

View file

@ -34,6 +34,8 @@ using android::base::unique_fd;
static void usage(int exit_code) {
fprintf(stderr, "usage: debuggerd [-b] PID\n");
fprintf(stderr, "\n");
fprintf(stderr, "-b, --backtrace just a backtrace rather than a full tombstone\n");
_exit(exit_code);
}
@ -56,7 +58,8 @@ static std::thread spawn_redirect_thread(unique_fd fd) {
int main(int argc, char* argv[]) {
if (argc <= 1) usage(0);
if (argc > 3) usage(1);
if (argc == 3 && strcmp(argv[1], "-b") != 0) usage(1);
if (argc == 3 && strcmp(argv[1], "-b") != 0 && strcmp(argv[1], "--backtrace") != 0) usage(1);
bool backtrace_only = argc == 3;
pid_t pid;
if (!android::base::ParseInt(argv[argc - 1], &pid, 1, std::numeric_limits<pid_t>::max())) {
@ -69,9 +72,8 @@ int main(int argc, char* argv[]) {
}
std::thread redirect_thread = spawn_redirect_thread(std::move(piperead));
bool backtrace = argc == 3;
if (!debuggerd_trigger_dump(pid, std::move(pipewrite),
backtrace ? kDebuggerdBacktrace : kDebuggerdTombstone, 0)) {
backtrace_only ? kDebuggerdBacktrace : kDebuggerdTombstone, 0)) {
redirect_thread.join();
errx(1, "failed to dump process %d", pid);
}

View file

@ -214,7 +214,8 @@ static void dump_probable_cause(log_t* log, const siginfo_t& si) {
cause = "call to kuser_cmpxchg64";
}
} else if (si.si_signo == SIGSYS && si.si_code == SYS_SECCOMP) {
cause = StringPrintf("seccomp prevented call to disallowed system call %d", si.si_syscall);
cause = StringPrintf("seccomp prevented call to disallowed %s system call %d",
ABI_STRING, si.si_syscall);
}
if (!cause.empty()) _LOG(log, logtype::HEADER, "Cause: %s\n", cause.c_str());