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

Commit 71296be6 authored by Steven Moreland's avatar Steven Moreland Committed by Gerrit Code Review
Browse files

Merge "Expose binder stability for debugging in dumpsys"

parents 3caff151 e5a6a878
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