From 01a2daf1ef992e123b20a0a20469ff07c1ef350c Mon Sep 17 00:00:00 2001 From: Devin Moore Date: Wed, 31 Jan 2024 18:02:29 +0000 Subject: Add a method to get the binderfs transactions for a given process Get the section in /dev/binderfs/binder_logs/transactions for that PID as a single string. Test: adb shell am hang Bug: 316970771 Change-Id: I951621379032550bd347341c9406da8a06fa7b29 --- libs/binderdebug/BinderDebug.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'libs/binderdebug/BinderDebug.cpp') diff --git a/libs/binderdebug/BinderDebug.cpp b/libs/binderdebug/BinderDebug.cpp index a8f2cbfb5b..19f3aad04f 100644 --- a/libs/binderdebug/BinderDebug.cpp +++ b/libs/binderdebug/BinderDebug.cpp @@ -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 " 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 -- cgit v1.2.3-59-g8ed1b