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)