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

Commit 8c540c77 authored by Devin Moore's avatar Devin Moore Committed by Gerrit Code Review
Browse files

Merge "Add a method to get the binderfs transactions for a given process" into main

parents 2d0d712f 01a2daf1
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -199,4 +199,31 @@ status_t getBinderClientPids(BinderDebugContext context, pid_t pid, pid_t servic
    return ret;
}

status_t getBinderTransactions(pid_t pid, std::string& transactionsOutput) {
    std::ifstream ifs("/dev/binderfs/binder_logs/transactions");
    if (!ifs.is_open()) {
        ifs.open("/d/binder/transactions");
        if (!ifs.is_open()) {
            LOG(ERROR) << "Could not open /dev/binderfs/binder_logs/transactions. "
                       << "Likely a permissions issue. errno: " << errno;
            return -errno;
        }
    }

    std::string line;
    while (getline(ifs, line)) {
        // The section for this pid ends with another "proc <pid>" for another
        // process. There is only one entry per pid so we can stop looking after
        // we've grabbed the whole section
        if (base::StartsWith(line, "proc " + std::to_string(pid))) {
            do {
                transactionsOutput += line + '\n';
            } while (getline(ifs, line) && !base::StartsWith(line, "proc "));
            return OK;
        }
    }

    return NAME_NOT_FOUND;
}

} // namespace  android
+8 −0
Original line number Diff line number Diff line
@@ -44,4 +44,12 @@ status_t getBinderPidInfo(BinderDebugContext context, pid_t pid, BinderPidInfo*
status_t getBinderClientPids(BinderDebugContext context, pid_t pid, pid_t servicePid,
                             int32_t handle, std::vector<pid_t>* pids);

/**
 * Get the transactions for a given process from /dev/binderfs/binder_logs/transactions
 * Return: OK if the file was found and the pid was found in the file.
 *         -errno if there was an issue opening the file
 *         NAME_NOT_FOUND if the pid wasn't found in the file
 */
status_t getBinderTransactions(pid_t pid, std::string& transactionOutput);

} // namespace  android