[PATCH 5/7] rust_binder: Implement the BINDER_DEBUG_FAILED_TRANSACTION logging mask for transaction parsing and routing failures

From: Jahnavi MN via B4 Relay

Date: Fri Jul 03 2026 - 11:35:05 EST


From: Jahnavi MN <jahnavimn@xxxxxxxxxx>

This adds dynamic debug logs for:
- Failed replies, target process deaths, and error code deliveries.
- Detailed transaction failure diagnostics (including sender/receiver
PIDs, TIDs, transaction IDs, buffer sizes, and error codes).
- File descriptor (FD) array validation and translation errors.

Signed-off-by: Jahnavi MN <jahnavimn@xxxxxxxxxx>
---
drivers/android/binder/thread.rs | 40 +++++++++++++++++++++++++++++++----
drivers/android/binder/transaction.rs | 5 +++++
2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thread.rs
index ecf05cebcb3e..1656e0c70fef 100644
--- a/drivers/android/binder/thread.rs
+++ b/drivers/android/binder/thread.rs
@@ -1191,6 +1191,11 @@ fn deliver_single_reply(
}

if inner.is_dead {
+ binder_debug!(
+ crate::debug::BINDER_DEBUG_FAILED_TRANSACTION,
+ "send failed reply for transaction {}, target dead",
+ transaction.debug_id
+ );
return true;
}

@@ -1198,7 +1203,18 @@ fn deliver_single_reply(
Ok(work) => {
inner.push_work(work);
}
- Err(code) => inner.push_reply_work(code),
+ Err(code) => {
+ if code == BR_FAILED_REPLY || code == BR_DEAD_REPLY {
+ binder_debug!(
+ crate::debug::BINDER_DEBUG_FAILED_TRANSACTION,
+ "send failed reply for transaction {} to {}:{}",
+ transaction.debug_id,
+ self.process.task.pid(),
+ self.task.pid()
+ );
+ }
+ inner.push_reply_work(code)
+ }
}
}

@@ -1297,11 +1313,27 @@ fn transaction(self: &Arc<Self>, cmd: u32, reader: &mut UserSliceReader) -> Resu
ee.param = source.to_errno();
}

- pr_warn!(
- "{}:{} transaction to {} failed: {source:?}",
+ binder_debug!(
+ crate::debug::BINDER_DEBUG_FAILED_TRANSACTION,
+ "{}:{} transaction {} to {}:{} failed {}/{}/{}, code {} size {}-{} line {}",
info.from_pid,
info.from_tid,
- info.to_pid
+ if info.is_reply {
+ "reply"
+ } else if info.is_oneway() {
+ "async"
+ } else {
+ "call"
+ },
+ info.to_pid,
+ info.to_tid,
+ info.debug_id,
+ err.reply,
+ info.errno,
+ info.code,
+ info.data_size,
+ info.offsets_size,
+ line!()
);
}
}
diff --git a/drivers/android/binder/transaction.rs b/drivers/android/binder/transaction.rs
index f9285eb93fc0..f8756c5dfba4 100644
--- a/drivers/android/binder/transaction.rs
+++ b/drivers/android/binder/transaction.rs
@@ -405,6 +405,11 @@ fn do_work(
} else {
// On failure to process the list, we send a reply back to the sender and ignore the
// transaction on the recipient.
+ binder_debug!(
+ crate::debug::BINDER_DEBUG_FAILED_TRANSACTION,
+ "transaction {} fd fixups failed",
+ self.debug_id
+ );
return Ok(true);
};


--
2.55.0.rc0.799.gd6f94ed593-goog