Intereting Posts
Android – Понижение растрового изображения на холсте Позволяют пользователям создавать формы в андроидном обследовании / сборе данных Нет необходимости регистрировать базовый класс активности в манифесте? RemoveCallbacks не останавливается Использование андроида Google Maps API v2 как средство просмотра офлайн-плит: возможно ли это? Сохранение пользовательского интерфейса при изменении ориентации – onSaveInstanceState не работает, как ожидалось, если сохранить фрагмент Есть ли что-то похожее на XML-чертежи Android в iOS? Adb может отображать устройства, но adb shell / logcat не работает Получение окна с сервисного андроида Android. Можете ли вы обновить результаты курсора для SQLite? Как сохранить экран в своем приложении? Как ограничить текстовое поле редактирования Android только для некоторых выбранных символов Неожиданный код ответа 500 для метода POST Область измерения неправильного многоугольника в android Recycliewiew Не подключен адаптер; Пропуская макет

Выключение потока с неперехваченным исключением: отсутствие трассировки стека

Мое приложение вызывает силовое соединение где-то, но вместо того, чтобы получать FATAL EXCEPTION с обычной (и очень информативной) трассировкой стека в моем LogCat, я получаю только следующие 4 строки:

06-27 07:08:54.546: D/dalvikvm(14351): GC_FOR_MALLOC freed 9923 objects / 657416 bytes in 21ms 06-27 07:08:54.769: W/dalvikvm(14351): threadid=20: thread exiting with uncaught exception (group=0x4001d7f0) 06-27 07:08:54.796: W/dalvikvm(14351): threadid=21: thread exiting with uncaught exception (group=0x4001d7f0) 06-27 07:08:54.796: I/Process(14351): Sending signal. PID: 14351 SIG: 9 

Это находится в режиме DEBUG с NO FILTERS, примененным к LogCat!

  • Что может быть причиной такого поведения?
  • Есть ли способ рассказать, что вызывает это исключение?

Обновление: благодаря @assylias ниже, я смог реализовать:

 final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread paramThread, Throwable paramThrowable) { Log.getStackTraceString(paramThrowable); subclass.uncaughtException(paramThread, paramThrowable); } }); 

Что создало эти добавленные строки:

 06-27 08:24:47.105: D/dalvikvm(15475): GC_FOR_MALLOC freed 13865 objects / 1435952 bytes in 45ms 06-27 08:24:47.136: I/dalvikvm(15475): threadid=15: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 06-27 08:24:47.136: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x45209338 (56 left) 06-27 08:24:47.140: I/dalvikvm(15475): expanding stack end (0x45209300 to 0x45209000) 06-27 08:24:47.140: I/dalvikvm(15475): Shrank stack (to 0x45209300, curFrame is 0x4520937c) 06-27 08:24:47.159: I/dalvikvm(15475): threadid=16: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 06-27 08:24:47.159: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520c338 (56 left) 06-27 08:24:47.167: I/dalvikvm(15475): expanding stack end (0x4520c300 to 0x4520c000) 06-27 08:24:47.167: I/dalvikvm(15475): Shrank stack (to 0x4520c300, curFrame is 0x4520c37c) 06-27 08:24:47.175: I/dalvikvm(15475): threadid=17: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 06-27 08:24:47.175: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520f338 (56 left) 06-27 08:24:47.175: I/dalvikvm(15475): expanding stack end (0x4520f300 to 0x4520f000) 06-27 08:24:47.175: I/dalvikvm(15475): Shrank stack (to 0x4520f300, curFrame is 0x4520f37c) 

Это, безусловно, гораздо более полезная информация, но теперь я борюсь со следующим:

  • Приложение не принудительно закрывается, несмотря на вызов subclass.uncaughtException() . Зачем?
  • В чем смысл всех переполнений стека? Что я могу сделать, так это платить за мое плохое тестовое устройство Android?
  • Как я могу узнать, какая часть моего кода вызывает это?

Обновление: Log.getStackTraceString(paramThrowable); На самом деле ничего не печатал. Дополнительный отпечаток, который я получил, был из поддельного subclass.uncaughtException (paramThread, paramThrowable); Правильный способ регистрации полной трассировки стека – использовать Log.e (TAG, «uncaughtException», throwable) .

Единственный вопрос, оставшийся сейчас, заключается в том, как перебросить исключение? Просто сделайте throw paramThrowable ?

Отвечая на мой последний вопрос: Eclipse не позволит мне бросить без окружающих с try / catch, что привело меня к пониманию того, что я хочу не повторять, а killProcess() . Задача решена.

Solutions Collecting From Web of "Выключение потока с неперехваченным исключением: отсутствие трассировки стека"

Вы можете установить обработчик исключений по умолчанию в начале вашего приложения и зарегистрировать некоторые данные там (пример ниже использует java-журнал, но легко переносит на Android):

 private static void setDefaultUncaughtExceptionHandler() { try { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { logger.error("Uncaught Exception detected in thread {}", t, e); } }); } catch (SecurityException e) { logger.error("Could not set the Default Uncaught Exception Handler", e); } } 

Это будет утомительно, но я бы сделал один шаг до тех пор, пока он не сломается с отладчиком. То вы можете добавить более общий улов

Catch (исключение e) {}

Все исключения распространяются от Exception, так что это может помочь вам в дальнейшей диагностике проблемы.

Еще одна идея, возможно, вы используете приложение для работы с памятью устройства. JVM может убить ваше приложение, не сообщив вам из-за отключения JVM на ошибке памяти.

Я знаю, что это старо, но если кто-то еще захочет узнать о выходе, как обычно, после рассмотрения неперехваченного исключения:

 final Thread.UncaughtExceptionHandler androidDefaultUEH = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(final Thread thread, final Throwable ex) { // Handle exception however you want, then: androidDefaultUEH.uncaughtException(thread, ex); } });