From b540eb9d6ee3133f9065ef3991c11fce4f1bd0f4 Mon Sep 17 00:00:00 2001 From: Devin Moore Date: Fri, 16 Feb 2024 22:34:01 +0000 Subject: Add some binder transaction info when dumping backtraces for ANR This adds the transaction info for each PID above the backtrace in the generated file. Test: adb shell am hang Bug: 316970771 Change-Id: Ie2174253f644f2d1214ad7cec7d1103d447aab55 --- core/jni/Android.bp | 1 + core/jni/android_os_Debug.cpp | 51 ++++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 45bb629928bd..8c6bf79d9731 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -301,6 +301,7 @@ cc_library_shared_for_libandroid_runtime { "libdebuggerd_client", "libutils", "libbinder", + "libbinderdebug", "libbinder_ndk", "libui", "libgraphicsenv", diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 9593fe584195..3c2dccd451d4 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -16,44 +16,46 @@ #define LOG_TAG "android.os.Debug" +#include "android_os_Debug.h" + +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include #include #include #include +#include #include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include #include #include +#include +#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include - -#include -#include #include "jni.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "android_os_Debug.h" -#include namespace android { @@ -579,6 +581,15 @@ static bool dumpTraces(JNIEnv* env, jint pid, jstring fileName, jint timeoutSecs return false; } + std::string binderState; + android::status_t status = android::getBinderTransactions(pid, binderState); + if (status == android::OK) { + if (!android::base::WriteStringToFd(binderState, fd)) { + PLOG(ERROR) << "Failed to dump binder state info for pid: " << pid; + } + } else { + PLOG(ERROR) << "Failed to get binder state info for pid: " << pid << " status: " << status; + } int res = dump_backtrace_to_file_timeout(pid, dumpType, timeoutSecs, fd); if (fdatasync(fd.get()) != 0) { PLOG(ERROR) << "Failed flushing trace."; -- cgit v1.2.3-59-g8ed1b