Как узнать причину сбоя приложения?

Я регулярно получаю печально известное бесполезное сообщение «к сожалению, crappyApp перестало работать». Как понять, что на самом деле пошло не так? Я предполагаю, что где-то есть трассировка стека, хотя в идеале я хотел бы изменить само бесполезное сообщение, если это возможно на корневом устройстве.

Для начала у нас есть тэг-вики по устранению неполадок ;)

Ответы (4)

Вы можете просто увидеть трассировку стека сбоя после любого сбоя. Используйте команду ADB ниже,

adb logcat -b crash #default
adb -d logcat -b crash #show from device when multiple device
adb -s logcat -b crash #show from simulator when multiple device

Есть несколько способов получить полезную информацию. Но, как указал Дэн , для решений на устройстве потребуется root (начиная с JellyBean) — и решения вне устройства ADB:

  • adb logcatуже было описано в ответе Дэна . Для более подробной информации вы можете посмотреть нашу tag-wiki для .
  • adb bugreport > report.txtдает очень подробную информацию, включая сведения из инструментов dumpsys, dumpstateи . logcatНесколько инструментов для более легкого анализа его вывода можно найти, например, в ответах на лучший метод просмотра вывода «adb bugreport»? на нашем дочернем сайте.
  • на вашем компьютере должны быть установлены инструменты, которые используют вышеперечисленное (или, по крайней мере, его части), такие как QtADB (для Linux, Mac и Windows)
  • есть приложения для Android, такие как Bug Reporter ; но, как уже отмечалось, для большинства из них потребуется root. Однако Bug Report Reader утверждает, что читает системные журналы (logcat, dumpsys, dmesg, top и многие другие) на вашем устройстве без рута , так что, возможно, стоит попробовать.

В большинстве случаев, если включена отладка по USB, можно использовать adb logcatдля просмотра вывода исключений. Обычно это включает трассировку стека, но это не часто полезно, если у вас нет исходного кода приложения. Тем не менее, разработчик приложения, вероятно, будет благодарен, если вы включите его в отчет об ошибке.

Спасибо, я бы предпочел нативное решение прямо на устройстве, если это возможно. хорошее замечание о полезности, разве трассировка, по крайней мере, не включает разумно названные исключения Java? или dalvik их запутывает?
Существуют приложения для чтения журнала с устройства (поищите в Google Play logcat ), но в Jelly Bean и более поздних версиях приложения не могут читать журналы друг друга, поэтому для этого вам может потребоваться рутирование вашего устройства. Трассировка включает имена исключений Java, но NullPointerExceptionна самом деле мало что говорит вам, если вы не разработчик приложения.
хорошая мысль об этом исключении: / поскольку я все равно рутировал свое устройство, я надеялся на более удобный способ, чем logcat, хотя это лучше, чем ничего ...

Прочитайте файлы, под /data/anr/которыми стоит «приложения не отвечают». я используюadb shell cat /data/anr/$FILE

Будет по одному для каждого приложения, которое принудительно закрывается или по какой-то причине не отвечает.

При просмотре /data/anr/ в корневом файловом проводнике есть только один файл traces.txt, который был изменен три дня назад (хотя сегодня произошел сбой приложения), и он, похоже, содержит только системные сбои, а не сбои приложений. Есть ли другой способ увидеть эти обратные следы приложений?