Loading cmds/dumpstate/DumpstateUtil.cpp +32 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "DumpstateUtil.h" #include <dirent.h> #include <fcntl.h> #include <sys/prctl.h> #include <sys/wait.h> Loading @@ -25,7 +26,10 @@ #include <vector> #include <android-base/file.h> #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> #include <cutils/log.h> #include "DumpstateInternal.h" Loading Loading @@ -342,3 +346,31 @@ int RunCommandToFd(int fd, const std::string& title, const std::vector<std::stri return status; } int GetPidByName(const std::string& ps_name) { DIR* proc_dir; struct dirent* ps; unsigned int pid; std::string cmdline; if (!(proc_dir = opendir("/proc"))) { MYLOGE("Can't open /proc\n"); return -1; } while ((ps = readdir(proc_dir))) { if (!(pid = atoi(ps->d_name))) { continue; } android::base::ReadFileToString("/proc/" + std::string(ps->d_name) + "/cmdline", &cmdline); if (cmdline.find(ps_name) == std::string::npos) { continue; } else { closedir(proc_dir); return pid; } } MYLOGE("can't find the pid\n"); closedir(proc_dir); return -1; } cmds/dumpstate/DumpstateUtil.h +6 −0 Original line number Diff line number Diff line Loading @@ -174,4 +174,10 @@ int RunCommandToFd(int fd, const std::string& title, const std::vector<std::stri */ int DumpFileToFd(int fd, const std::string& title, const std::string& path); /* * Finds the process id by process name. * |ps_name| the process name we want to search for */ int GetPidByName(const std::string& ps_name); #endif // FRAMEWORK_NATIVE_CMD_DUMPSTATE_UTIL_H_ cmds/dumpstate/dumpstate.cpp +1 −28 Original line number Diff line number Diff line Loading @@ -189,34 +189,7 @@ static void dump_dev_files(const char *title, const char *driverpath, const char closedir(d); } // return pid of a userspace process. If not found or error, return 0. static unsigned int pid_of_process(const char* ps_name) { DIR *proc_dir; struct dirent *ps; unsigned int pid; std::string cmdline; if (!(proc_dir = opendir("/proc"))) { MYLOGE("Can't open /proc\n"); return 0; } while ((ps = readdir(proc_dir))) { if (!(pid = atoi(ps->d_name))) { continue; } android::base::ReadFileToString("/proc/" + std::string(ps->d_name) + "/cmdline", &cmdline); if (cmdline.find(ps_name) == std::string::npos) { continue; } else { closedir(proc_dir); return pid; } } closedir(proc_dir); return 0; } // dump anrd's trace and add to the zip file. // 1. check if anrd is running on this device. Loading @@ -239,7 +212,7 @@ static bool dump_anrd_trace() { } // find anrd's pid if it is running. pid = pid_of_process("/system/xbin/anrd"); pid = GetPidByName("/system/xbin/anrd"); if (pid > 0) { if (stat(trace_path, &st) == 0) { Loading cmds/dumpstate/tests/dumpstate_test.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -845,6 +845,14 @@ class DumpstateUtilTest : public DumpstateBaseTest { return status; } // Find out the pid of the process_name int FindPidOfProcess(const std::string& process_name) { CaptureStderr(); int status = GetPidByName(process_name); err = GetCapturedStderr(); return status; } int fd; // 'fd` output and `stderr` from the last command ran. Loading Loading @@ -1137,3 +1145,15 @@ TEST_F(DumpstateUtilTest, DumpFileOnDryRun) { out, StartsWith("------ Might as well dump. Dump! (" + kTestDataPath + "single-line.txt:")); EXPECT_THAT(out, EndsWith("skipped on dry run\n")); } TEST_F(DumpstateUtilTest, FindingPidWithExistingProcess) { // init process always has pid 1. EXPECT_EQ(1, FindPidOfProcess("init")); EXPECT_THAT(err, IsEmpty()); } TEST_F(DumpstateUtilTest, FindingPidWithNotExistingProcess) { // find the process with abnormal name. EXPECT_EQ(-1, FindPidOfProcess("abcdef12345-543")); EXPECT_THAT(err, StrEq("can't find the pid\n")); } Loading
cmds/dumpstate/DumpstateUtil.cpp +32 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "DumpstateUtil.h" #include <dirent.h> #include <fcntl.h> #include <sys/prctl.h> #include <sys/wait.h> Loading @@ -25,7 +26,10 @@ #include <vector> #include <android-base/file.h> #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> #include <cutils/log.h> #include "DumpstateInternal.h" Loading Loading @@ -342,3 +346,31 @@ int RunCommandToFd(int fd, const std::string& title, const std::vector<std::stri return status; } int GetPidByName(const std::string& ps_name) { DIR* proc_dir; struct dirent* ps; unsigned int pid; std::string cmdline; if (!(proc_dir = opendir("/proc"))) { MYLOGE("Can't open /proc\n"); return -1; } while ((ps = readdir(proc_dir))) { if (!(pid = atoi(ps->d_name))) { continue; } android::base::ReadFileToString("/proc/" + std::string(ps->d_name) + "/cmdline", &cmdline); if (cmdline.find(ps_name) == std::string::npos) { continue; } else { closedir(proc_dir); return pid; } } MYLOGE("can't find the pid\n"); closedir(proc_dir); return -1; }
cmds/dumpstate/DumpstateUtil.h +6 −0 Original line number Diff line number Diff line Loading @@ -174,4 +174,10 @@ int RunCommandToFd(int fd, const std::string& title, const std::vector<std::stri */ int DumpFileToFd(int fd, const std::string& title, const std::string& path); /* * Finds the process id by process name. * |ps_name| the process name we want to search for */ int GetPidByName(const std::string& ps_name); #endif // FRAMEWORK_NATIVE_CMD_DUMPSTATE_UTIL_H_
cmds/dumpstate/dumpstate.cpp +1 −28 Original line number Diff line number Diff line Loading @@ -189,34 +189,7 @@ static void dump_dev_files(const char *title, const char *driverpath, const char closedir(d); } // return pid of a userspace process. If not found or error, return 0. static unsigned int pid_of_process(const char* ps_name) { DIR *proc_dir; struct dirent *ps; unsigned int pid; std::string cmdline; if (!(proc_dir = opendir("/proc"))) { MYLOGE("Can't open /proc\n"); return 0; } while ((ps = readdir(proc_dir))) { if (!(pid = atoi(ps->d_name))) { continue; } android::base::ReadFileToString("/proc/" + std::string(ps->d_name) + "/cmdline", &cmdline); if (cmdline.find(ps_name) == std::string::npos) { continue; } else { closedir(proc_dir); return pid; } } closedir(proc_dir); return 0; } // dump anrd's trace and add to the zip file. // 1. check if anrd is running on this device. Loading @@ -239,7 +212,7 @@ static bool dump_anrd_trace() { } // find anrd's pid if it is running. pid = pid_of_process("/system/xbin/anrd"); pid = GetPidByName("/system/xbin/anrd"); if (pid > 0) { if (stat(trace_path, &st) == 0) { Loading
cmds/dumpstate/tests/dumpstate_test.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -845,6 +845,14 @@ class DumpstateUtilTest : public DumpstateBaseTest { return status; } // Find out the pid of the process_name int FindPidOfProcess(const std::string& process_name) { CaptureStderr(); int status = GetPidByName(process_name); err = GetCapturedStderr(); return status; } int fd; // 'fd` output and `stderr` from the last command ran. Loading Loading @@ -1137,3 +1145,15 @@ TEST_F(DumpstateUtilTest, DumpFileOnDryRun) { out, StartsWith("------ Might as well dump. Dump! (" + kTestDataPath + "single-line.txt:")); EXPECT_THAT(out, EndsWith("skipped on dry run\n")); } TEST_F(DumpstateUtilTest, FindingPidWithExistingProcess) { // init process always has pid 1. EXPECT_EQ(1, FindPidOfProcess("init")); EXPECT_THAT(err, IsEmpty()); } TEST_F(DumpstateUtilTest, FindingPidWithNotExistingProcess) { // find the process with abnormal name. EXPECT_EQ(-1, FindPidOfProcess("abcdef12345-543")); EXPECT_THAT(err, StrEq("can't find the pid\n")); }