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; } }