From 977abb05bc8e28edd0c233a318b865b380dd4101 Mon Sep 17 00:00:00 2001 From: Github Executorch Date: Wed, 3 Sep 2025 18:30:28 -0700 Subject: [PATCH] Summary: Add detailed error message to exception flow This should enhance the triaging and debuggability of Android ET related issues Test Plan: Build & CI Reviewers: Subscribers: Tasks: Tags: --- .../ExecutorchRuntimeException.java | 50 +++++++++++++++---- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java b/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java index de823f40afb..e180efcdfca 100644 --- a/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java +++ b/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java @@ -75,17 +75,49 @@ public class ExecutorchRuntimeException extends RuntimeException { } static class ErrorHelper { + // Reusable StringBuilder instance + private static final StringBuilder sb = new StringBuilder(); + static String formatMessage(int errorCode, String details) { - String baseMessage = ERROR_CODE_MESSAGES.get(errorCode); - if (baseMessage == null) { - baseMessage = "Unknown error code 0x" + Integer.toHexString(errorCode); + synchronized (sb) { + sb.setLength(0); // Clear the StringBuilder before use + + String baseMessage = ERROR_CODE_MESSAGES.get(errorCode); + if (baseMessage == null) { + baseMessage = "Unknown error code 0x" + Integer.toHexString(errorCode); + } + + sb.append("[Executorch Error 0x") + .append(Integer.toHexString(errorCode)) + .append("] ") + .append(baseMessage) + .append(": ") + .append(details) + .append("\nDetailed Logs:\n"); + + try { + String[] logEntries = readLogBuffer(); // JNI call + formatLogEntries(sb, logEntries); + } catch (Exception e) { + sb.append("Failed to retrieve detailed logs: ").append(e.getMessage()); + } + + return sb.toString(); + } + } + + // Native JNI method declaration + private static native String[] readLogBuffer(); + + // Append log entries to the provided StringBuilder + private static void formatLogEntries(StringBuilder sb, String[] logEntries) { + if (logEntries == null || logEntries.length == 0) { + sb.append("No detailed logs available."); + return; + } + for (String entry : logEntries) { + sb.append(entry).append("\n"); } - return "[Executorch Error 0x" - + Integer.toHexString(errorCode) - + "] " - + baseMessage - + ": " - + details; } }