Perfprofd: Add invoke failure logging
Try to log the perferr text file when a simpleperf run failed. Attempt
to make run failures easier to diagnose.
Bug: 73175642
Test: perfprofd_test
Change-Id: I00124a28242ff9018e6ec7289ba57017364d69be
diff --git a/perfprofd/perfprofdcore.cc b/perfprofd/perfprofdcore.cc
index a152111..57cee81 100644
--- a/perfprofd/perfprofdcore.cc
+++ b/perfprofd/perfprofdcore.cc
@@ -465,6 +465,7 @@
pid_t pid = fork();
if (pid == -1) {
+ PLOG(ERROR) << "Fork failed";
return ERR_FORK_FAILED;
}
@@ -562,6 +563,15 @@
int st = 0;
pid_t reaped = TEMP_FAILURE_RETRY(waitpid(pid, &st, 0));
+ auto print_perferr = [&perf_stderr_path]() {
+ std::string tmp;
+ if (android::base::ReadFileToString(perf_stderr_path, &tmp)) {
+ LOG(WARNING) << tmp;
+ } else {
+ PLOG(WARNING) << "Could not read " << perf_stderr_path;
+ }
+ };
+
if (reaped == -1) {
PLOG(WARNING) << "waitpid failed";
} else if (WIFSIGNALED(st)) {
@@ -570,8 +580,10 @@
return OK_PROFILE_COLLECTION;
}
LOG(WARNING) << "perf killed by signal " << WTERMSIG(st);
+ print_perferr();
} else if (WEXITSTATUS(st) != 0) {
LOG(WARNING) << "perf bad exit status " << WEXITSTATUS(st);
+ print_perferr();
} else {
return OK_PROFILE_COLLECTION;
}
diff --git a/perfprofd/tests/perfprofd_test.cc b/perfprofd/tests/perfprofd_test.cc
index 8314880..63d58db 100644
--- a/perfprofd/tests/perfprofd_test.cc
+++ b/perfprofd/tests/perfprofd_test.cc
@@ -590,14 +590,16 @@
// Check return code from daemon
EXPECT_EQ(0, daemon_main_return_code);
- // Verify log contents
- const std::string expected = RAW_RESULT(
- W: perf bad exit status 1
- W: profile collection failed
- );
+ // Verify log contents. Because of perferr logging containing pids and test paths,
+ // it is easier to have three expected parts.
+ const std::string expected1 = "W: perf bad exit status 1";
+ const std::string expected2 = "W: /bin/false record";
+ const std::string expected3 = "W: profile collection failed";
// check to make sure log excerpt matches
- EXPECT_TRUE(CompareLogMessages(expected));
+ EXPECT_TRUE(CompareLogMessages(expected1));
+ EXPECT_TRUE(CompareLogMessages(expected2));
+ EXPECT_TRUE(CompareLogMessages(expected3));
}
TEST_F(PerfProfdTest, ConfigFileParsing)