Loading libs/binderdebug/BinderDebug.cpp +27 −0 Original line number Diff line number Diff line Loading @@ -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 libs/binderdebug/include/binderdebug/BinderDebug.h +8 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
libs/binderdebug/BinderDebug.cpp +27 −0 Original line number Diff line number Diff line Loading @@ -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
libs/binderdebug/include/binderdebug/BinderDebug.h +8 −0 Original line number Diff line number Diff line Loading @@ -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