Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3658c3bc authored by Steven Moreland's avatar Steven Moreland Committed by Automerger Merge Worker
Browse files

Merge "Expose binder stability for debugging in dumpsys" am: 71296be6

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1712769

Change-Id: I9fbc90101babd007ffa722dae54ec380d2768a98
parents 3f711658 71296be6
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -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>
@@ -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");
}

@@ -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
@@ -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;
            }
@@ -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);
@@ -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;
+4 −3
Original line number Diff line number Diff line
@@ -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
    };

+21 −0
Original line number Diff line number Diff line
@@ -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"});
+2 −2
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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