From 5c267879191a7a5e9d8c92c7e78174d32eb8f539 Mon Sep 17 00:00:00 2001 From: Mike Ma Date: Wed, 21 Aug 2019 11:31:34 -0700 Subject: Add a dedicated function to dump incident report Capturing incident report in dumpstate used to be bundled in dumpsys proto, which was inflexible and subject to 10s time limit. This patch creates a dedicated function in dumpstate to dump incident report proto. It takes around 15s to complete on a new device. Bug: 137493082 Test: Manually takes a bugreport from command line, power button, and BetterBug. Verifies /proto/incident_report.proto exists in the zip file, and no unintended avc denial. Change-Id: Ia253e24afda4a7c1ef92fc564df465311be6fe3a --- cmds/dumpstate/dumpstate.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'cmds/dumpstate/dumpstate.cpp') diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index 693525ae68..92b126658a 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -918,6 +918,31 @@ static void DoLogcat() { "-v", "uid", "-d", "*:v"}); } +static void DumpIncidentReport() { + if (!ds.IsZipping()) { + MYLOGD("Not dumping incident report because it's not a zipped bugreport\n"); + return; + } + DurationReporter duration_reporter("INCIDENT REPORT"); + const std::string path = ds.bugreport_internal_dir_ + "/tmp_incident_report"; + auto fd = android::base::unique_fd(TEMP_FAILURE_RETRY(open(path.c_str(), + O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))); + if (fd < 0) { + MYLOGE("Could not open %s to dump incident report.\n", path.c_str()); + return; + } + RunCommandToFd(fd, "", {"incident", "-u"}, CommandOptions::WithTimeout(120).Build()); + bool empty = 0 == lseek(fd, 0, SEEK_END); + if (!empty) { + // Use a different name from "incident.proto" + // /proto/incident.proto is reserved for incident service dump + // i.e. metadata for debugging. + ds.AddZipEntry(kProtoPath + "incident_report" + kProtoExt, path); + } + unlink(path.c_str()); +} + static void DumpIpTablesAsRoot() { RunCommand("IPTABLES", {"iptables", "-L", "-nvx"}); RunCommand("IP6TABLES", {"ip6tables", "-L", "-nvx"}); @@ -1490,6 +1515,9 @@ static Dumpstate::RunStatus dumpstate() { printf("========================================================\n"); // This differs from the usual dumpsys stats, which is the stats report data. RunDumpsys("STATSDSTATS", {"stats", "--metadata"}); + + RUN_SLOW_FUNCTION_WITH_CONSENT_CHECK(DumpIncidentReport); + return Dumpstate::RunStatus::OK; } -- cgit v1.2.3-59-g8ed1b