Loading cmds/dumpsys/dumpsys.cpp +16 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <android-base/unique_fd.h> #include <binder/Parcel.h> #include <binder/ProcessState.h> #include <binder/Stability.h> #include <binder/TextOutput.h> #include <binderdebug/BinderDebug.h> #include <serviceutils/PriorityDumper.h> Loading Loading @@ -69,12 +70,13 @@ static void usage() { " -t TIMEOUT_SEC: TIMEOUT to use in seconds instead of default 10 seconds\n" " -T TIMEOUT_MS: TIMEOUT to use in milliseconds instead of default 10 seconds\n" " --pid: dump PID instead of usual dump\n" " --thread: dump thread usage instead of usual dump\n" " --proto: filter services that support dumping data in proto format. Dumps\n" " will be in proto format.\n" " --priority LEVEL: filter services based on specified priority\n" " LEVEL must be one of CRITICAL | HIGH | NORMAL\n" " --skip SERVICES: dumps all services but SERVICES (comma-separated list)\n" " --stability: dump binder stability information instead of usual dump\n" " --thread: dump thread usage instead of usual dump\n" " SERVICE [ARGS]: dumps only service SERVICE, optionally passing ARGS to it\n"); } Loading Loading @@ -128,12 +130,13 @@ int Dumpsys::main(int argc, char* const argv[]) { Type type = Type::DUMP; int timeoutArgMs = 10000; int priorityFlags = IServiceManager::DUMP_FLAG_PRIORITY_ALL; static struct option longOptions[] = {{"thread", no_argument, 0, 0}, static struct option longOptions[] = {{"help", no_argument, 0, 0}, {"pid", no_argument, 0, 0}, {"priority", required_argument, 0, 0}, {"proto", no_argument, 0, 0}, {"skip", no_argument, 0, 0}, {"help", no_argument, 0, 0}, {"stability", no_argument, 0, 0}, {"thread", no_argument, 0, 0}, {0, 0, 0, 0}}; // Must reset optind, otherwise subsequent calls will fail (wouldn't happen on main.cpp, but Loading Loading @@ -167,6 +170,8 @@ int Dumpsys::main(int argc, char* const argv[]) { } } else if (!strcmp(longOptions[optionIndex].name, "pid")) { type = Type::PID; } else if (!strcmp(longOptions[optionIndex].name, "stability")) { type = Type::STABILITY; } else if (!strcmp(longOptions[optionIndex].name, "thread")) { type = Type::THREAD; } Loading Loading @@ -335,6 +340,11 @@ static status_t dumpPidToFd(const sp<IBinder>& service, const unique_fd& fd) { return OK; } static status_t dumpStabilityToFd(const sp<IBinder>& service, const unique_fd& fd) { WriteStringToFd(internal::Stability::debugToString(service) + "\n", fd); return OK; } static status_t dumpThreadsToFd(const sp<IBinder>& service, const unique_fd& fd) { pid_t pid; status_t status = service->getDebugPid(&pid); Loading Loading @@ -382,6 +392,9 @@ status_t Dumpsys::startDumpThread(Type type, const String16& serviceName, case Type::PID: err = dumpPidToFd(service, remote_end); break; case Type::STABILITY: err = dumpStabilityToFd(service, remote_end); break; case Type::THREAD: err = dumpThreadsToFd(service, remote_end); break; Loading cmds/dumpsys/dumpsys.h +4 −3 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ class Dumpsys { enum class Type { DUMP, // dump using `dump` function PID, // dump pid of server only STABILITY, // dump stability information of server THREAD, // dump thread usage of server only }; Loading cmds/dumpsys/tests/dumpsys_test.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -582,6 +582,27 @@ TEST_F(DumpsysTest, ListServiceWithPid) { AssertOutput(std::to_string(getpid()) + "\n"); } // Tests 'dumpsys --stability' TEST_F(DumpsysTest, ListAllServicesWithStability) { ExpectListServices({"Locksmith", "Valet"}); ExpectCheckService("Locksmith"); ExpectCheckService("Valet"); CallMain({"--stability"}); AssertRunningServices({"Locksmith", "Valet"}); AssertOutputContains("stability"); } // Tests 'dumpsys --stability service_name' TEST_F(DumpsysTest, ListServiceWithStability) { ExpectCheckService("Locksmith"); CallMain({"--stability", "Locksmith"}); AssertOutputContains("stability"); } // Tests 'dumpsys --thread' TEST_F(DumpsysTest, ListAllServicesWithThread) { ExpectListServices({"Locksmith", "Valet"}); Loading libs/binder/Stability.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -79,9 +79,9 @@ void Stability::markVintf(IBinder* binder) { LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object."); } void Stability::debugLogStability(const std::string& tag, const sp<IBinder>& binder) { std::string Stability::debugToString(const sp<IBinder>& binder) { auto stability = getCategory(binder.get()); ALOGE("%s: stability is %s", tag.c_str(), stability.debugString().c_str()); return stability.debugString(); } void Stability::markVndk(IBinder* binder) { Loading libs/binder/include/binder/Stability.h +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ public: static void markVintf(IBinder* binder); // WARNING: for debugging only static void debugLogStability(const std::string& tag, const sp<IBinder>& binder); static std::string debugToString(const sp<IBinder>& binder); // WARNING: This is only ever expected to be called by auto-generated code or tests. // You likely want to change or modify the stability of the interface you are using. Loading Loading
cmds/dumpsys/dumpsys.cpp +16 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <android-base/unique_fd.h> #include <binder/Parcel.h> #include <binder/ProcessState.h> #include <binder/Stability.h> #include <binder/TextOutput.h> #include <binderdebug/BinderDebug.h> #include <serviceutils/PriorityDumper.h> Loading Loading @@ -69,12 +70,13 @@ static void usage() { " -t TIMEOUT_SEC: TIMEOUT to use in seconds instead of default 10 seconds\n" " -T TIMEOUT_MS: TIMEOUT to use in milliseconds instead of default 10 seconds\n" " --pid: dump PID instead of usual dump\n" " --thread: dump thread usage instead of usual dump\n" " --proto: filter services that support dumping data in proto format. Dumps\n" " will be in proto format.\n" " --priority LEVEL: filter services based on specified priority\n" " LEVEL must be one of CRITICAL | HIGH | NORMAL\n" " --skip SERVICES: dumps all services but SERVICES (comma-separated list)\n" " --stability: dump binder stability information instead of usual dump\n" " --thread: dump thread usage instead of usual dump\n" " SERVICE [ARGS]: dumps only service SERVICE, optionally passing ARGS to it\n"); } Loading Loading @@ -128,12 +130,13 @@ int Dumpsys::main(int argc, char* const argv[]) { Type type = Type::DUMP; int timeoutArgMs = 10000; int priorityFlags = IServiceManager::DUMP_FLAG_PRIORITY_ALL; static struct option longOptions[] = {{"thread", no_argument, 0, 0}, static struct option longOptions[] = {{"help", no_argument, 0, 0}, {"pid", no_argument, 0, 0}, {"priority", required_argument, 0, 0}, {"proto", no_argument, 0, 0}, {"skip", no_argument, 0, 0}, {"help", no_argument, 0, 0}, {"stability", no_argument, 0, 0}, {"thread", no_argument, 0, 0}, {0, 0, 0, 0}}; // Must reset optind, otherwise subsequent calls will fail (wouldn't happen on main.cpp, but Loading Loading @@ -167,6 +170,8 @@ int Dumpsys::main(int argc, char* const argv[]) { } } else if (!strcmp(longOptions[optionIndex].name, "pid")) { type = Type::PID; } else if (!strcmp(longOptions[optionIndex].name, "stability")) { type = Type::STABILITY; } else if (!strcmp(longOptions[optionIndex].name, "thread")) { type = Type::THREAD; } Loading Loading @@ -335,6 +340,11 @@ static status_t dumpPidToFd(const sp<IBinder>& service, const unique_fd& fd) { return OK; } static status_t dumpStabilityToFd(const sp<IBinder>& service, const unique_fd& fd) { WriteStringToFd(internal::Stability::debugToString(service) + "\n", fd); return OK; } static status_t dumpThreadsToFd(const sp<IBinder>& service, const unique_fd& fd) { pid_t pid; status_t status = service->getDebugPid(&pid); Loading Loading @@ -382,6 +392,9 @@ status_t Dumpsys::startDumpThread(Type type, const String16& serviceName, case Type::PID: err = dumpPidToFd(service, remote_end); break; case Type::STABILITY: err = dumpStabilityToFd(service, remote_end); break; case Type::THREAD: err = dumpThreadsToFd(service, remote_end); break; Loading
cmds/dumpsys/dumpsys.h +4 −3 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ class Dumpsys { enum class Type { DUMP, // dump using `dump` function PID, // dump pid of server only STABILITY, // dump stability information of server THREAD, // dump thread usage of server only }; Loading
cmds/dumpsys/tests/dumpsys_test.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -582,6 +582,27 @@ TEST_F(DumpsysTest, ListServiceWithPid) { AssertOutput(std::to_string(getpid()) + "\n"); } // Tests 'dumpsys --stability' TEST_F(DumpsysTest, ListAllServicesWithStability) { ExpectListServices({"Locksmith", "Valet"}); ExpectCheckService("Locksmith"); ExpectCheckService("Valet"); CallMain({"--stability"}); AssertRunningServices({"Locksmith", "Valet"}); AssertOutputContains("stability"); } // Tests 'dumpsys --stability service_name' TEST_F(DumpsysTest, ListServiceWithStability) { ExpectCheckService("Locksmith"); CallMain({"--stability", "Locksmith"}); AssertOutputContains("stability"); } // Tests 'dumpsys --thread' TEST_F(DumpsysTest, ListAllServicesWithThread) { ExpectListServices({"Locksmith", "Valet"}); Loading
libs/binder/Stability.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -79,9 +79,9 @@ void Stability::markVintf(IBinder* binder) { LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object."); } void Stability::debugLogStability(const std::string& tag, const sp<IBinder>& binder) { std::string Stability::debugToString(const sp<IBinder>& binder) { auto stability = getCategory(binder.get()); ALOGE("%s: stability is %s", tag.c_str(), stability.debugString().c_str()); return stability.debugString(); } void Stability::markVndk(IBinder* binder) { Loading
libs/binder/include/binder/Stability.h +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ public: static void markVintf(IBinder* binder); // WARNING: for debugging only static void debugLogStability(const std::string& tag, const sp<IBinder>& binder); static std::string debugToString(const sp<IBinder>& binder); // WARNING: This is only ever expected to be called by auto-generated code or tests. // You likely want to change or modify the stability of the interface you are using. Loading