From cd4d6631fabdfda39818eb561734104369f776b9 Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Thu, 5 Jan 2017 15:05:46 -0800 Subject: [PATCH] Added -t option to dumpstate. This option takes a lightweight version of bugreport that only includes a few, urgent sections used to report telephony bugs. BUG: 32589463 BUG: 26849505 Test: manual Merged-In: I9b7369323a62e30e5d740eeb22db0045262387ba Change-Id: I9b7369323a62e30e5d740eeb22db0045262387ba --- cmds/dumpstate/dumpstate.cpp | 200 ++++++++++++++++++++++++------------------- cmds/dumpstate/dumpstate.rc | 8 ++ 2 files changed, 122 insertions(+), 86 deletions(-) diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index ee481fbabd..0929d9b9e9 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -908,9 +908,63 @@ static void dump_iptables() { run_command("IP6TABLES RAW", 10, "ip6tables", "-t", "raw", "-L", "-nvx", NULL); } +static void do_kmsg() { + struct stat st; + if (!stat(PSTORE_LAST_KMSG, &st)) { + /* Also TODO: Make console-ramoops CAP_SYSLOG protected. */ + dump_file("LAST KMSG", PSTORE_LAST_KMSG); + } else if (!stat(ALT_PSTORE_LAST_KMSG, &st)) { + dump_file("LAST KMSG", ALT_PSTORE_LAST_KMSG); + } else { + /* TODO: Make last_kmsg CAP_SYSLOG protected. b/5555691 */ + dump_file("LAST KMSG", "/proc/last_kmsg"); + } +} + +static void do_logcat() { + unsigned long timeout; + // dump_file("EVENT LOG TAGS", "/etc/event-log-tags"); + // calculate timeout + timeout = logcat_timeout("main") + logcat_timeout("system") + logcat_timeout("crash"); + if (timeout < 20000) { + timeout = 20000; + } + run_command("SYSTEM LOG", timeout / 1000, "logcat", "-v", "threadtime", + "-v", "printable", + "-d", + "*:v", NULL); + timeout = logcat_timeout("events"); + if (timeout < 20000) { + timeout = 20000; + } + run_command("EVENT LOG", timeout / 1000, "logcat", "-b", "events", + "-v", "threadtime", + "-v", "printable", + "-d", + "*:v", NULL); + timeout = logcat_timeout("radio"); + if (timeout < 20000) { + timeout = 20000; + } + run_command("RADIO LOG", timeout / 1000, "logcat", "-b", "radio", + "-v", "threadtime", + "-v", "printable", + "-d", + "*:v", NULL); + + run_command("LOG STATISTICS", 10, "logcat", "-b", "all", "-S", NULL); + + /* kernels must set CONFIG_PSTORE_PMSG, slice up pstore with device tree */ + run_command("LAST LOGCAT", 10, "logcat", "-L", + "-b", "all", + "-v", "threadtime", + "-v", "printable", + "-d", + "*:v", NULL); +} + static void dumpstate(const std::string& screenshot_path, const std::string& version) { DurationReporter duration_reporter("DUMPSTATE"); - unsigned long timeout; dump_dev_files("TRUSTY VERSION", "/sys/bus/platform/drivers/trusty", "trusty_version"); run_command("UPTIME", 10, "uptime", NULL); @@ -954,36 +1008,7 @@ static void dumpstate(const std::string& screenshot_path, const std::string& ver MYLOGI("wrote screenshot: %s\n", screenshot_path.c_str()); } - // dump_file("EVENT LOG TAGS", "/etc/event-log-tags"); - // calculate timeout - timeout = logcat_timeout("main") + logcat_timeout("system") + logcat_timeout("crash"); - if (timeout < 20000) { - timeout = 20000; - } - run_command("SYSTEM LOG", timeout / 1000, "logcat", "-v", "threadtime", - "-v", "printable", - "-d", - "*:v", NULL); - timeout = logcat_timeout("events"); - if (timeout < 20000) { - timeout = 20000; - } - run_command("EVENT LOG", timeout / 1000, "logcat", "-b", "events", - "-v", "threadtime", - "-v", "printable", - "-d", - "*:v", NULL); - timeout = logcat_timeout("radio"); - if (timeout < 20000) { - timeout = 20000; - } - run_command("RADIO LOG", timeout / 1000, "logcat", "-b", "radio", - "-v", "threadtime", - "-v", "printable", - "-d", - "*:v", NULL); - - run_command("LOG STATISTICS", 10, "logcat", "-b", "all", "-S", NULL); + do_logcat(); /* show the traces we collected in main(), if that was done */ if (dump_traces_path != NULL) { @@ -1051,23 +1076,7 @@ static void dumpstate(const std::string& screenshot_path, const std::string& ver dump_file("QTAGUID CTRL INFO", "/proc/net/xt_qtaguid/ctrl"); dump_file("QTAGUID STATS INFO", "/proc/net/xt_qtaguid/stats"); - if (!stat(PSTORE_LAST_KMSG, &st)) { - /* Also TODO: Make console-ramoops CAP_SYSLOG protected. */ - dump_file("LAST KMSG", PSTORE_LAST_KMSG); - } else if (!stat(ALT_PSTORE_LAST_KMSG, &st)) { - dump_file("LAST KMSG", ALT_PSTORE_LAST_KMSG); - } else { - /* TODO: Make last_kmsg CAP_SYSLOG protected. b/5555691 */ - dump_file("LAST KMSG", "/proc/last_kmsg"); - } - - /* kernels must set CONFIG_PSTORE_PMSG, slice up pstore with device tree */ - run_command("LAST LOGCAT", 10, "logcat", "-L", - "-b", "all", - "-v", "threadtime", - "-v", "printable", - "-d", - "*:v", NULL); + do_kmsg(); /* The following have a tendency to get wedged when wifi drivers/fw goes belly-up. */ @@ -1215,14 +1224,15 @@ static void dumpstate(const std::string& screenshot_path, const std::string& ver static void usage() { fprintf(stderr, - "usage: dumpstate [-h] [-b soundfile] [-e soundfile] [-o file [-d] [-p] " - "[-z]] [-s] [-S] [-q] [-B] [-P] [-R] [-V version]\n" + "usage: dumpstate [-h] [-b soundfile] [-e soundfile] [-o file [-d] [-p] [-t]" + "[-z] [-s] [-S] [-q] [-B] [-P] [-R] [-V version]\n" " -h: display this help message\n" " -b: play sound file instead of vibrate, at beginning of job\n" " -e: play sound file instead of vibrate, at end of job\n" " -o: write to file (instead of stdout)\n" " -d: append date to filename (requires -o)\n" " -p: capture screenshot to filename.png (requires -o)\n" + " -t: only captures telephony sections\n" " -z: generate zipped file (requires -o)\n" " -s: write output to control socket (for init)\n" " -S: write file location to control socket (for init; requires -o and -z)" @@ -1319,6 +1329,8 @@ int main(int argc, char *argv[]) { int do_broadcast = 0; int do_early_screenshot = 0; int is_remote_mode = 0; + bool telephony_only = false; + std::string version = VERSION_DEFAULT; now = time(NULL); @@ -1359,9 +1371,10 @@ int main(int argc, char *argv[]) { format_args(argc, const_cast(argv), &args); MYLOGD("Dumpstate command line: %s\n", args.c_str()); int c; - while ((c = getopt(argc, argv, "dho:svqzpPBRSV:")) != -1) { + while ((c = getopt(argc, argv, "dho:svqzptPBRSV:")) != -1) { switch (c) { case 'd': do_add_date = 1; break; + case 't': telephony_only = true; break; case 'z': do_zip_file = 1; break; case 'o': use_outfile = optarg; break; case 's': use_socket = 1; break; @@ -1458,6 +1471,9 @@ int main(int argc, char *argv[]) { char build_id[PROPERTY_VALUE_MAX]; property_get("ro.build.id", build_id, "UNKNOWN_BUILD"); base_name = base_name + "-" + build_id; + if (telephony_only) { + base_name = base_name + "-telephony"; + } if (do_fb) { // TODO: if dumpstate was an object, the paths could be internal variables and then // we could have a function to calculate the derived values, such as: @@ -1567,48 +1583,60 @@ int main(int argc, char *argv[]) { // duration is logged into MYLOG instead. print_header(version); - // Dumps systrace right away, otherwise it will be filled with unnecessary events. - // First try to dump anrd trace if the daemon is running. Otherwise, dump - // the raw trace. - if (!dump_anrd_trace()) { - dump_systrace(); - } - - // TODO: Drop root user and move into dumpstate() once b/28633932 is fixed. - dump_raft(); - - // Invoking the following dumpsys calls before dump_traces() to try and - // keep the system stats as close to its initial state as possible. - run_command_as_shell("DUMPSYS MEMINFO", 30, "dumpsys", "-t", "30", "meminfo", "-a", NULL); - run_command_as_shell("DUMPSYS CPUINFO", 10, "dumpsys", "-t", "10", "cpuinfo", "-a", NULL); + if (telephony_only) { + dump_iptables(); + if (!drop_root_user()) { + return -1; + } + do_dmesg(); + do_logcat(); + do_kmsg(); + dumpstate_board(); + dump_modem_logs(); + } else { + // Dumps systrace right away, otherwise it will be filled with unnecessary events. + // First try to dump anrd trace if the daemon is running. Otherwise, dump + // the raw trace. + if (!dump_anrd_trace()) { + dump_systrace(); + } - /* collect stack traces from Dalvik and native processes (needs root) */ - dump_traces_path = dump_traces(); + // TODO: Drop root user and move into dumpstate() once b/28633932 is fixed. + dump_raft(); + + // Invoking the following dumpsys calls before dump_traces() to try and + // keep the system stats as close to its initial state as possible. + run_command_as_shell("DUMPSYS MEMINFO", 30, "dumpsys", "-t", "30", "meminfo", "-a", NULL); + run_command_as_shell("DUMPSYS CPUINFO", 10, "dumpsys", "-t", "10", "cpuinfo", "-a", NULL); + + /* collect stack traces from Dalvik and native processes (needs root) */ + dump_traces_path = dump_traces(); + + /* Run some operations that require root. */ + get_tombstone_fds(tombstone_data); + add_dir(RECOVERY_DIR, true); + add_dir(RECOVERY_DATA_DIR, true); + add_dir(LOGPERSIST_DATA_DIR, false); + if (!is_user_build()) { + add_dir(PROFILE_DATA_DIR_CUR, true); + add_dir(PROFILE_DATA_DIR_REF, true); + } + add_mountinfo(); + dump_iptables(); - /* Run some operations that require root. */ - get_tombstone_fds(tombstone_data); - add_dir(RECOVERY_DIR, true); - add_dir(RECOVERY_DATA_DIR, true); - add_dir(LOGPERSIST_DATA_DIR, false); - if (!is_user_build()) { - add_dir(PROFILE_DATA_DIR_CUR, true); - add_dir(PROFILE_DATA_DIR_REF, true); - } - add_mountinfo(); - dump_iptables(); + // Capture any IPSec policies in play. No keys are exposed here. + run_command("IP XFRM POLICY", 10, "ip", "xfrm", "policy", nullptr); - // Capture any IPSec policies in play. No keys are exposed here. - run_command("IP XFRM POLICY", 10, "ip", "xfrm", "policy", nullptr); + // Run ss as root so we can see socket marks. + run_command("DETAILED SOCKET STATE", 10, "ss", "-eionptu", NULL); - // Run ss as root so we can see socket marks. - run_command("DETAILED SOCKET STATE", 10, "ss", "-eionptu", NULL); + if (!drop_root_user()) { + return -1; + } - if (!drop_root_user()) { - return -1; + dumpstate(do_early_screenshot ? "": screenshot_path, version); } - dumpstate(do_early_screenshot ? "": screenshot_path, version); - /* close output if needed */ if (is_redirecting) { fclose(stdout); diff --git a/cmds/dumpstate/dumpstate.rc b/cmds/dumpstate/dumpstate.rc index 3448e91088..336db9fcd1 100644 --- a/cmds/dumpstate/dumpstate.rc +++ b/cmds/dumpstate/dumpstate.rc @@ -46,3 +46,11 @@ service bugreportwear /system/bin/dumpstate -d -B -P -p -z \ class main disabled oneshot + +# bugreportelefony is a lightweight version of bugreport that only includes a few, urgent +# sections used to report telephony bugs. +service bugreportelefony /system/bin/dumpstate -t -d -B -z \ + -o /data/user_de/0/com.android.shell/files/bugreports/bugreport + class main + disabled + oneshot -- 2.11.0