Как посмотреть журнал ошибок на андроид

Краткая инструкция по чтению и разбору логов мобильных устройств на Android и iOS, а также необходимые инструменты для Windows и MacOS.Статья подготовлена red_ma...

Краткая инструкция по чтению и разбору логов мобильных устройств на Android и iOS, а также необходимые инструменты для Windows и MacOS.

Статья подготовлена red_mad_robot и «Альфа-Банком» на основе доклада Senior QA red_mad_robot Ольги Никитиной «Инструменты для снятия логов с Android / iOS устройств. Чтение и разбор» на митапе «QАчественное общение» при поддержке red_mad_robot.

Уровни логирования и что они означают

Для начала разберёмся с логами. Это текстовые файлы, в которых записываются все действия пользователя. Например, какие кнопки он нажимает в приложении и как на это оно реагирует в ответ.

Записи в логах формируются в хронологическом порядке. Самая свежая — внизу.

Есть два вида логов:

  • Crash logs — файл, в котором хранятся записи только об ошибках экстренного завершения программы — по-простому, когда приложение крашнулось.

  • Logs — простые логи, или журнал событий. Это файл, в котором хранятся системные записи и ответы устройства на действие пользователя.

Логи на мобильных устройствах бывают нескольких уровней:

  • ERROR,

  • WARN,

  • INFO,

  • DEBUG,

  • VERBOSE.

Они представлены по уровню важности — от самого высокого к самому низкому, — и каждый следующий уровень включает в себя предыдущий. Например, VERBOSE содержит в себе логи всех остальных.

Примечание: уровни более применимы к логам на Android, потому что именно там такое разделение встречается чаще.

Рассмотрим подробнее каждый уровень.

Error (ERROR)

На этом уровне информируются ошибки работы системы.

Записи этого уровня требуют быстрого вмешательства разработчика — на такие ошибки нужно реагировать максимально быстро.

Как пример, такая запись в логе:

“ SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length ”

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

Или вот:

“ [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008] ] ”

Эта системная ошибка сообщает, что происходит утечка памяти при взаимодействии с каким-то элементом или приложением.

Warning (WARN)

На этом уровне отображаются записи, сообщающие о каком-то неожиданном поведении, требующем внимания, или о ситуации, которая незнакома системе.

Например, сообщение ниже — запись из тестового приложения:

“ [OMX.hisi.video.decoder.avc] setting nBufferCountActual to 16 failed: -2147483648 “

Мы пытаемся декодировать запись в какой-то формат, но его нет. Ошибка сообщает о неуспешной попытке настройки видеоплеера в нужном формате.

Ещё пример:

“ BroadcastQueue: Permission Denial: broadcasting Intent ”

Эта системная ошибка говорит о сбое в работе одного из виджетов на устройстве.

Info (INFO)

На этот уровень приходят записи информационного характера, например о работе системы.

Допустим, такое сообщение об уровне заряда батареи на устройстве:

“ APwBatteryMonitor: screen off start battery: 100 ”

А это сообщение говорит о том, что экран устройства был выключен:

“ HwBatteryService: intent = Intent { act=android.intent.action.SCREEN_OFF flg=0x58200010 } ” 

Ещё в логи этого уровня входят запросы от клиента на сервер: хедеры, тело запросов, которые отправляет клиент, и ответы сервера.

“ okhttp.OkHttpClient: <— 200 https://domainname/api/v1/smth/deals (1691ms)

okhttp.OkHttpClient: server: nginx/1.15.9

okhttp.OkHttpClient: date: Thu, 23 Sep 2021 19:41:17 GMT

okhttp.OkHttpClient: content-type: application/json

okhttp.OkHttpClient: vary: Accept-Encoding

okhttp.OkHttpClient: strict-transport-security: max-age=15724800; includeSubDomains

okhttp.OkHttpClient: {«key»:{«key»:value,»name»:»»},»key»:value,»key»:value}

okhttp.OkHttpClient: <— END HTTP ”

Такие записи могут помочь вам в понимании какого-то бага или в разборе задачи при условии, что вы не можете перехватить трафик или не знаете, какие запросы отправляются на бэкенд.

Debug (DEBUG)

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

Например, в записи ниже сказано, что пользователь нажимал на кнопку уменьшения или увеличения громкости:

“ MediaSessionService: dispatchVolumeKeyEvent ”

Сначала мы видим запись о самом факте нажатия на кнопку, далее оно расшифровывается подробнее:

{ action=ACTION_DOWN, keyCode=KEYCODE_VOLUME_UP }

Ещё пример: если ваше приложение использует сокет-сессию, то на уровне DEBUG мы можем увидеть, когда сессия начинается и заканчивается:

“ b$b: WebSocket connected ”

Verbose (VERBOSE)

Сообщения такого уровня уточняют или раскрывают действия.

Например, у нас есть служба управления окнами на экране приложения. И на уровне Verbose мы можем увидеть подробности её работы.

Открытие окна:

WindowManager: addWindow

Закрытие окна:

WindowManager: Removing Window

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

GnssLocationProvider: reportLocation Location […] 

А меняя звук на устройстве, мы увидим, как растёт или падает значение:

AudioManager: getStreamVolume  streamType: 3 volume: 10

Каждое нажатие, то есть изменение звука, будет отражаться новым сообщением.

Verbose — уровень самого низкого приоритета. Выбирая такой уровень отображения логов, мы будем видеть записи и со всех предыдущих уровней.

Примечание: разработчики приложения самостоятельно покрывают действия логами, определяют уровни, а также какие сообщения какому из них соответствуют.

Инструменты для снятия логов: Android

Расскажем о трёх способах.

Первый  Logcat в составе Android Studio, самый известный и широко используемый.

Для снятия логов нам необходимо перевести устройство в режим разработчика/отладки. Для этого нужно:

  • найти в настройках номер нашего билда или ОС (в зависимости от устройства),

  • около десяти раз нажать на эту информацию,

  • при появлении сообщения о том, не хотим ли мы перевести устройство в режим разработчика, нажать «Ок».

Примечание: алгоритм может отличаться в зависимости от производителя устройства, потому что у многих из них свои надстройки на ОС Android.

Дальше подключаем устройство по USB к ПК и устанавливаем Android Studio.
Следующие шаги на скрине:

  1. Выбираем вкладку Logcat (переходим к сообщениям в реальном времени).

  2. В окошке выбираем телефон, с которого снимаем логи.

  3. На этой вкладке выбираем логи определённого приложения. Если нужно снять вообще все логи со всех приложений и системы, эту вкладку стоит не трогать. Рядом с ней можно выбрать уровень логирования (вкладка Verbose на скрине).

  4. В поле поиска, где мы можем фильтровать выдачу, разрешено писать что угодно — от названия пакета до частей вроде fatal.

На скрине видно логи с подключенного устройства.

Второй способ — выгрузка логов с самого устройства. Кроме режима разработчика нам нужно подключить устройство к ПК через USB и установить ADB — Android Debug Bridge.

Открываем терминал и пишем две команды.

Первая — adb devices — показывает подключённые устройства, которые видит ADB. В терминале выглядит так:

Название устройства — 7BKDU18504001505

Название устройства — 7BKDU18504001505

Вводим вторую команду — adb -s название устройства logcat, — которая запускает утилиту Logcat для конкретного устройства. В терминале в реальном времени будут поступать логи.

Как их читать?

  1. В первом столбце — дата и время поступления записи.

  2. Во втором — обозначения уровней логирования. Например, D — это Debug.

  3. В третьем показываются названия инструмента, утилиты, пакета, от которых поступает сообщение, а также расшифровка того, что вообще происходит.

Третий инструмент — SDK Platform Tools. Процесс его установки практически аналогичен предыдущим двум:

  • переводим телефон в режим разработчика,

  • подключаем к ПК по USB,

  • скачиваем на ПК папку SDK PT (под свою ОС),

  • открываем папку SDK PT в терминале.

Теперь пишем команду ./adb logcat –v threadtime > ./android-debug.log.

В терминале это выглядит так:

Прерываем выполнение команды (например, на Mac это Control+C). Лог добавляется в папку.

Открываем:

В первом столбце — дата и время, во втором — уровни логов, в третьем — указание на то, от какой части системы поступают данные, лог и его расшифровка/подробности

В первом столбце — дата и время, во втором — уровни логов, в третьем — указание на то, от какой части системы поступают данные, лог и его расшифровка/подробности

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

Инструменты снятия логов: iOS

В первую очередь нас интересует xCode — интегрированная среда разработки (IDE), в которую встроен нужный нам инструмент Simulator.

Как использовать инструмент:

  1. Устанавливаем xCode.

  2. В системной строке нажимаем xCode → Open Developer Tools → Simulator.

  3. Устанавливаем приложение.

  4. В самом симуляторе выбираем Debug → Open System Log.

Мы будем видеть логи в реальном времени:

Подобное оформление логов мы уже где-то видели, но построение информации в выдаче немного отличается. Есть дата и время (1) и данные (2) о том, с какого устройства снята информация: имя компьютера, элемент системы, с которого пришло сообщение, и его расшифровка.

Но первый способ работает только с симуляторами. Если необходимо снимать логи с реального устройства, в этом может помочь раздел Devices and Simulators.

Записи можно отфильтровать по конкретному процессу (вашему приложению):

  1. Устанавливаем xCode.

  2. Подключаем устройство к ПК по USB.

  3. Открываем xCode → Windows → Devices and Simulators.

Дальше нажимаем у устройства Open Console и видим панель с названием устройства, информацией о модели и ОС:

1 — все приложения, которые установлены на устройстве, 2 — версия устройства, 3 — пакет приложения устройства

1 — все приложения, которые установлены на устройстве, 2 — версия устройства, 3 — пакет приложения устройства

Логи поступают в реальном времени, но их удобно отслеживать:

У нас есть три столбца:

  1. «Время» — время поступления сообщения.

  2. «Процесс» — с какой части системы/приложения пришло сообщение.

  3. «Сообщение» — описание события, сервисная информация.

В инструменте есть поиск для фильтрации выдачи. Ещё есть полезная кнопка «Приостановить» — она останавливает поток логов.

А вот утилита iMazing поможет снимать iOS-логи для тех, у кого установлен Windows. Приложение платное, но часть функциональности доступна бесплатно. Например, за снятие логов устройства платить не нужно.

В меню выбираем «Показать консоль устройства». В открывшемся окне приходят записи логов в реальном времени со всего устройства.

1 — дата и время получения сообщения; 2 — имя телефона, информация, с какой части устройства пришло сообщение, и описание; 3 — поисковая строка для фильтрации выдачи

1 — дата и время получения сообщения; 2 — имя телефона, информация, с какой части устройства пришло сообщение, и описание; 3 — поисковая строка для фильтрации выдачи

Ещё одно важное достоинство iMazing — возможность сохранять логи (разумеется, по кнопке «Сохранить»).


Статья подготовлена red_mad_robot и «Альфа-Банком» на основе доклада Senior QA red_mad_robot Ольги Никитиной «Инструменты для снятия логов с Android / iOS устройств. Чтение и разбор» на митапе «QАчественное общение» при поддержке red_mad_robot.

Итак, как я получил историю взаимодействия с моим приложением? … По умолчанию история использования активности на вашем устройстве Android включена в настройках действий Google. Он хранит журнал всех приложений, которые вы открываете, с отметкой времени.

Re: есть ли в Android средство просмотра / журнала событий или что-то подобное? Да. Существует множество приложений logcat.

Как вы проверяете журнал активности на Android?

Посмотреть другие действия

  1. На телефоне или планшете Android откройте приложение «Настройки» вашего устройства. Google Управление учетной записью Google.
  2. Вверху нажмите Данные и конфиденциальность.
  3. В разделе «Настройки истории» нажмите «Мои действия».
  4. В строке поиска над вашими действиями нажмите «Другие действия в Google».

Где находится журнал событий в Android Studio?

On панель инструментов -> Меню справки -> Показать журнал в проводнике.

Как просмотреть журналы событий?

Проверка журналов событий Windows

  1. Нажмите ⊞ Win + R на компьютере-сервере M-Files. …
  2. В текстовом поле Open введите eventvwr и нажмите OK. …
  3. Разверните узел Журналы Windows.
  4. Выберите узел Application. …
  5. Щелкните «Фильтровать текущий журнал…» на панели «Действия» в разделе «Приложение», чтобы отобразить только записи, относящиеся к M-файлам.

Как просмотреть журнал событий Samsung?

Проверьте журналы событий

  1. Перейдите в Меню и выберите Поддержка.
  2. Щелкните О ТВ и проверьте журналы событий.
  3. 1. «Причина включения» появляется в журнале регистрации. …
  4. 2. «Команда CEC» появляется в истории журнала. …
  5. 3. В истории журнала появится «Одно невидимое соединение».

Как найти журнал событий на моем Samsung Galaxy?

Как получить логи с телефона или планшета Samsung

  1. Откройте приложение «Телефон» на своем устройстве и введите: * # 9900 #.
  2. В зависимости от того, сколько подробных журналов вы хотите получить, измените параметры Debug Level и Silent log (по умолчанию уровень отладки отключен / LOW, а Silent Log отключен)

Как мне найти историю на моем телефоне Android?

На вашем телефоне или планшете Android откройте приложение Chrome.

  1. В правом верхнем углу нажмите на значок «Ещё». История. Если адресная строка находится внизу, проведите по адресной строке вверх. Коснитесь История.
  2. Чтобы посетить сайт, коснитесь записи. Чтобы открыть сайт в новой вкладке, нажмите и удерживайте запись. В правом верхнем углу нажмите на значок «Ещё». Открыть в новой вкладке.

Могу ли я увидеть свои недавние действия?

Найти и просмотреть активность

На телефоне или планшете Android откройте приложение «Настройки» Google Аккаунт Google. Вверху нажмите Данные и персонализация. Под «Действия и график» нажмите «Мои действия».. Просмотр своей активности: просмотрите свои действия, организованные по дням и времени.

Могу ли я увидеть свое экранное время на Android?

Открыть настройки. Коснитесь Цифровое благополучие и родительский контроль. … The круговая диаграмма на экране «Цифровое благополучие» показано, какие приложения вы использовали. Внутри круга вы можете видеть общее время использования экрана, а под ним — сколько раз вы разблокировали и сколько уведомлений получили.

Что такое Logcat в Android?

Logcat — это инструмент командной строки, который выгружает журнал системных сообщений, включая трассировки стека, когда устройство выдает ошибку, и сообщения, которые вы написали из своего приложения с помощью класса Log.

Какие два основных типа потоков в Android?

В Android есть четыре основных типа потоков. Вы увидите, что в другой документации говорится еще больше, но мы сосредоточимся на Thread, Handler, AsyncTask и что-то под названием HandlerThread . Возможно, вы слышали, что HandlerThread просто назвал «комбинацию обработчика / лупера».

Как сохранить файл журнала на Android?

Каждое сообщение журнала регистрируется через android. утилита Журнал, а также записывается в текстовый файл на устройстве.

  1. Используйте logcat -f, как в этом ответе, для входа в файл. …
  2. Используйте microlog4android (написанный для мобильных устройств, таких как Android), как в предыдущем ответе. …
  3. Используйте Log4j с android-logging-log4j. …
  4. Еще предстоит попробовать LogBack.

В журналах устройства содержится информация, записанная системой и приложениями на нем. Эти данные временно хранятся на устройстве и регулярно удаляются.

По умолчанию всем приложениям доступны журналы, которые они создают. Google и производитель вашего устройства также могут иметь доступ к информации, необходимой для обновлений, обеспечения безопасности, технического обслуживания и анализа производительности системы.

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

Содержимое журналов устройства

Важно! Доступ ко всем журналам устройства следует предоставлять только тем приложениям, которым вы доверяете.

Журналы обычно содержат ограниченную техническую информацию, однако они также могут хранить данные об установленных приложениях, времени их использования, идентификаторах пользователя и устройства или другие сведения об активности приложений.

На Android 13, когда приложение запрашивает доступ ко всем журналам устройства для допустимых целей, таких как сбор отзывов о приложении и сведений об ошибках, вам предлагается разрешить приложению разовый доступ к этому более широкому набору данных.

Даже если вы не предоставите такой доступ, Google, производитель устройства или разработчики приложений все равно смогут получить доступ к некоторым журналам или подобной информации. Например, в Google отправляются данные об использовании и работе устройства, если на нем включен параметр Использование и диагностика.

Техническая информация

Понятие «все журналы устройства» относится ко всему содержимому буферов журналов, управляемых системным процессом logd. Если не предоставить доступ ко всем журналам, приложениям по-прежнему может быть доступна часть данных, например журнал событий.

Управление журналами устройства Android

Вы можете принять или отклонить запрос приложения на доступ ко всем журналам устройства.

Android 12 и более поздние версии

Когда появляется запрос, вам предлагается принять или отклонить его.

  • Чтобы предоставить доступ, выберите Разрешить разовый доступ.
  • Чтобы запретить доступ, нажмите Запретить.

Ресурсы по теме

  • Настройки Google
  • Настройки аккаунта
  • Настройки геоданных на устройстве Android

Эта информация оказалась полезной?

Как можно улучшить эту статью?

Приготовьте отладчик! Пишем приложение с ошибками, затем учимся их находить и дебажить

https://gbcdn.mrgcdn.ru/uploads/post/2735/og_image/ce05da5c8c8f97a3bf7713b7cbaf3802.png

Иногда в приложении встречаются ошибки, которые нельзя увидеть даже после запуска. Например, код компилируется, проект запускается, но результат далёк от желаемого: приложение падает или вдруг появляется какая-то ошибка (баг). В таких случаях приходится «запасаться логами», «брать в руки отладчик» и искать ошибки.

Часто процесс поиска и исправления бага состоит из трёх шагов:

  1. Воспроизведение ошибки — вы понимаете, какие действия нужно сделать в приложении, чтобы повторить ошибку.
  2. Поиск места ошибки — определяете класс и метод, в котором ошибка происходит.
  3. Исправление ошибки.

Если приложение не падает и чтение логов ничего не даёт, то найти точное место ошибки в коде помогает дебаггер (отладчик) — инструмент среды разработки.

    Чтобы посмотреть на логи и воспользоваться дебаггером, давайте напишем простое тестовое (и заведомо неправильное) приложение, которое даст нам все возможности для поиска ошибок.

    Это будет приложение, которое сравнивает два числа. Если числа равны, то будет выводиться результат «Равно», и наоборот. Начнём с простых шагов:

  1. Открываем Android Studio. 
  2. Создаём проект с шаблоном Empty Activity. 
  3. Выбираем язык Java, так как его, как правило, знают больше людей, чем Kotlin. 

Нам автоматически откроются две вкладки: activity_main.xml и MainActivity.java. Сначала нарисуем макет: просто замените всё, что есть в activity_main.xml, на код ниже:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">
 
  <EditText
     android:id="@+id/first_number_et"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:ems="10"
     android:gravity="center"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toTopOf="parent" />
 
  <EditText
     android:id="@+id/second_number_et"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:ems="10"
     android:gravity="center"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toBottomOf="@+id/first_number_et" />
 
  <Button
     android:id="@+id/button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Равно?"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toBottomOf="@+id/second_number_et" />
 
  <TextView
     android:id="@+id/answer_tv"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text=""
     android:textSize="32sp"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>

Можете запустить проект и посмотреть, что получилось:

Теперь оживим наше приложение. Скопируйте в MainActivity этот код:

public class MainActivity extends AppCompatActivity {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
 
     final Button button = (Button) findViewById(R.id.button);
     final EditText first = (EditText) findViewById(R.id.first_number_et);
     final EditText second = (EditText) findViewById(R.id.second_number_et);
     final TextView answer = (TextView) findViewById(R.id.answer_tv);
 
     button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           Integer firstInt = Integer.parseInt(first.getText().toString());
           Integer secondInt = Integer.parseInt(second.getText().toString());
           if (firstInt == secondInt) {
              answer.setText("Равно");
           } else {
              answer.setText("Равно");
           }
        }
     });
  }
}

В этом коде всё просто: 

  1. Находим поля ввода, поле с текстом и кнопку.
  2. Вешаем на кнопку слушатель нажатий.
  3. По нажатию на кнопку получаем числа из полей ввода и сравниваем их.
  4. В зависимости от результата выводим «Равно» или «Не равно».

Запустим приложение и введём буквы вместо чисел:

Нажмём на кнопку, и приложение упадёт! Время читать логи. Открываем внизу слева вкладку «6: Logcat» и видим:

Читать логи просто: нужно найти красный текст и прочитать сообщение системы. В нашем случае это java.lang.NumberFormatException: For input string: «f». Указан тип ошибки NumberFormatException, который говорит, что возникла какая-то проблема с форматированием числа. И дополнение: For input string: «f». Введено “f”. Уже можно догадаться, что программа ждёт число, а мы передаём ей символ. Далее в красном тексте видно и ссылку на проблемную строку: at com.example.appdebugging.MainActivity$1.onClick(MainActivity.java:26). Проблема в методе onClick класса MainActivity, строка 24. Можно просто кликнуть по ссылке и перейти на указанную строку:

int firstInt = Integer.parseInt(first.getText().toString());

Конечно, метод parseInt может принимать только числовые значения, но никак не буквенные! Даже в его описании это сказано — и мы можем увидеть, какой тип ошибки этот метод выбрасывает (NumberFormatException).

Здесь мы привели один из примеров. Типов ошибок может быть огромное количество, все мы рассматривать не будем. Но все ошибки в Logcat’е указываются по похожему принципу: 

  • красный текст;
  • тип ошибки — в нашем случае это NumberFormatException;
  • пояснение — у нас это For input string: «f»;
  • ссылка на строку, на которой произошла ошибка — здесь видим MainActivity.java:26. 

Исправим эту ошибку и обезопасим себя от некорректного ввода. Добавим в наши поля ввода android:inputType=»number», а остальной код оставим без изменений:

...
<EditText
  android:id="@+id/first_number_et"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:ems="10"
  android:gravity="center"
  android:inputType="number"
  app:layout_constraintLeft_toLeftOf="parent"
  app:layout_constraintRight_toRightOf="parent"
  app:layout_constraintTop_toTopOf="parent" />
 
<EditText
  android:id="@+id/second_number_et"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:ems="10"
  android:gravity="center"
  android:inputType="number"
  app:layout_constraintLeft_toLeftOf="parent"
  app:layout_constraintRight_toRightOf="parent"
  app:layout_constraintTop_toBottomOf="@+id/first_number_et" />
...

    Теперь можем вводить только числа. Проверим, как работает равенство: введём одинаковые числа в оба поля. Всё в порядке:

На равенство проверили. Введём разные числа: 

Тоже равно. То есть приложение работает, ничего не падает, но результат не совсем тот, который требуется. Наверняка вы и без дебаггинга догадались, в чём ошибка, потому что приложение очень простое, всего несколько строк кода. Но такие же проблемы возникают в приложениях и на миллион строк. Поэтому пройдём по уже известным нам этапам дебаггинга:

  1. Воспроизведём ошибку: да, ошибка воспроизводится стабильно с любыми двумя разными числами.
  2. Подумаем, где может быть ошибка: наверняка там, где сравниваются числа. Туда и будем смотреть.
  3. Исправим ошибку: сначала найдём её с помощью дебаггера, а когда поймём, в чём проблема, — будем исправлять.

И здесь на помощь приходит отладчик. Для начала поставим точки останова сразу в трёх местах:

    Чтобы поставить или снять точку останова, достаточно кликнуть левой кнопкой мыши справа от номера строки или поставить курсор на нужную строку, а затем нажать CTRL+F8. Почему мы хотим остановить программу именно там? Чтобы посмотреть, правильные ли числа сравниваются, а затем определить, в какую ветку в нашем ветвлении заходит программа дальше. Запускаем программу с помощью сочетания клавиш SHIFT+F9 или нажимаем на кнопку с жучком:

  

    Появится дополнительное окно, в котором нужно выбрать ваш девайс и приложение:

Вы в режиме дебага. Обратите внимание на две вещи:

  1. Точки останова теперь помечены галочками. Это значит, что вы находитесь на экране, где стоят эти точки, и что дебаггер готов к работе.
  2. Открылось окно дебага внизу: вкладка «5: Debug». В нём будет отображаться необходимая вам информация.

    Введём неравные числа и нажмём кнопку «РАВНО?». Программа остановилась на первой точке:

Давайте разбираться:

  1. Сразу подсвечивается синим строка, где программа остановлена: в окне кода на 28-й строке и в левом окне отладчика (там даже можно увидеть, какой метод вызван, — onClick).
  2. В правом, основном окне отладчика, всё гораздо интереснее. Здесь можно увидеть инстансы наших вью (answer, first, second), в конце которых серым текстом даже отображаются их id. Но интереснее всего посмотреть на firstInt и secondInt. Там записаны значения, которые мы сейчас будем сравнивать.

Как видим, значения именно такие, какие мы и ввели. Значит, проблема не в получении чисел из полей. Давайте двигаться дальше — нам нужно посмотреть, в правильную ли ветку мы заходим. Для этого можно нажать F8 (перейти на следующую строку выполнения кода). А если следующая точка останова далеко или в другом классе, можно нажать F9 — программа просто возобновит работу и остановится на следующей точке. В интерфейсе эти кнопки находятся здесь:

Остановить дебаггер, если он больше не нужен, можно через CTRL+F2 или кнопку «Стоп»:

    В нашем случае неважно, какую кнопку нажимать (F9 или F8). Мы сразу переходим к следующей точке останова программы:

Ветка правильная, то есть логика программы верна, числа firstInt и secondInt не изменились. Зато мы сразу видим, что подпись некорректная! Вот в чём была ошибка. Исправим подпись и проверим программу ещё раз.

    Мы уже починили два бага: падение приложения с помощью логов и некорректную логику (с помощью отладчика). Хеппи пас (happy path) пройден. То есть основная функциональность при корректных данных работает. Но нам надо проверить не только хеппи пас — пользователь может ввести что угодно. И программа может нормально работать в большинстве случаев, но вести себя странно в специфических состояниях. Давайте введём числа побольше и посмотрим, что будет:

Не сработало — программа хочет сказать, что 1000 не равна 1000, но это абсурд. Запускаем приложение в режиме отладки. Точка останова уже есть. Смотрим в отладчик:

Числа одинаковые, что могло пойти не так? Обращаем внимание на тип переменной — Integer. Так вот в чём проблема! Это не примитивный тип данных, а ссылочный. Ссылочные типы нельзя сравнивать через ==, потому что будут сравниваться ссылки объектов, а не они сами. Но для Integer в Java есть нюанс: Integer может кешироваться до 127, и если мы вводим по единице в оба поля числа до 127, то фактически сравниваем просто int. А если вводим больше, то получаем два разных объекта. Адреса у объектов не совпадают, а именно так Java сравнивает их.

Есть два решения проблемы:

  1. Изменить тип Integer на примитив int.
  2. Сравнивать как объекты.

    Не рекомендуется менять тип этих полей в реальном приложении: числа могут приходить извне, и тип лучше оставлять прежним. Изменим то, как мы сравниваем числа:

if (firstInt.equals(secondInt)) {
  answer.setText("Равно");
} else {
  answer.setText("Не равно");
}

Проверяем:

Всё работает. Наконец-то! Хотя… Давайте посмотрим, что будет, если пользователь ничего не введёт, но нажмёт на кнопку? Приложение опять упало… Смотрим в логи:

Опять NumberFormatException, при этом строка пустая. Давайте поставим точку останова на 26-й строке и заглянем с помощью отладчика глубже.

Нажмём F8 — и перейдём в глубины операционной системы:

    Интересно! Давайте обернём код в try/catch и посмотрим ошибке в лицо. Если что, поправим приложение. Выделяем код внутри метода onClick() и нажимаем Ctrl+Alt+T:

Выбираем try / catch, среда разработки сама допишет код. Поставим точку останова. Получим:

Запускаем приложение и ловим ошибку:

Действительно, как и в логах, — NumberFormatException. Метод parseInt выбрасывает исключение, если в него передать пустую строку. Как обрабатывать такую проблему — решать исключительно вам. Два самых простых способа:

  1. Проверять получаемые строки first.getText().toString() и second.getText().toString() на пустые значения. И если хоть одно значение пустое — говорить об этом пользователю и не вызывать метод parseInt.
  2. Или использовать уже готовую конструкцию try / catch:

Теперь-то точно всё в порядке! Хотя профессиональным тестировщикам это приложение никто не отдавал: поищете ещё ошибки? :)

Log-File locations

There are several directories where logs (including those from crashes) might appear — not all of them are standardized (i.e. some may be ROM-specific).

  • /data/anr: Some trace files seem to get here (Dalvik writes stack traces here on ANR, i.e. «Application Not Responding» aka «Force-Close»; see e.g. log excerpts here)
  • /data/dontpanic seems to be a standard location (AOSP), and contains some crash logs including traces (see e.g. viaForensics and StackOverflow)
  • /data/kernelpanics is another location — not having had any «kernel panic» on my Android devices, I saw no content there yet.
  • the /data/panic/panic_daemon.config may point to other locations configured — on my Droid 2 it mentions /sdcard/panic_data/
  • mentioned Droid 2 also has a /data/panicreports directory (empty here)
  • /data/tombstones may hold several tombstone_nn files (with nn being a serial, increased with every new file). As tombstones are placed for the dead, it is done here for «processes died by accident» (i.e. crashed) — and it is what is referred to as «core dumps» on Linux/Unix systems. However, not all apps create tombstones; this must be explicitly enabled by the developer (see Debugging Android Core Dumps).

There may be some more locations which escaped me; but as most logging is done on tmpfs, these data are lost with a reboot, and would not match the OPs question.

Log commands to use with a terminal app (or adb)

Several commands can get you tons of information. For most of them, it is to recommend to re-direct them to a file (> filename.ext) or pipe them through a filter (| grep search-for-this):

Kernel log

The following works without root:

$ dmesg
<6>[82839.126586] PM: Syncing filesystems ... done.
<7>[82839.189056] PM: Preparing system for mem sleep
<4>[82839.189361] Freezing user space processes ... (elapsed 0.05 seconds) done.
<4>[82839.240661] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
<snip>

Logcat

Here you can e.g. specify what area you are interested in — radio, events…

# logcat -b events
I/am_create_service( 3457): [1085416560,nitro.phonestats/.widget.WidgetProvider4x1$WidgetUpdateService4x1,,3721]
I/am_destroy_service( 3457): [1085416560,nitro.phonestats/.widget.WidgetProvider4x1$WidgetUpdateService4x1,3721]
I/notification_cancel( 3457): [nitro.phonestats,4,0] 
<snip>

Getting device info

And tons of it: Device specifics, account information, services…

$ dumpsys
Currently running services:
  LocationProxyService
  SurfaceFlinger
  accessibility
  account
  activity
<snip>
DUMP OF SERVICE account:
Accounts:
  1 Account {name=xxxxxxx@googlemail.com, type=com.google}
<snip> 

$ dumpstate
========================================================
== dumpstate: 2012-08-18 23:39:53
========================================================

Build: Gingerbread GWK74 - CyanogenMilestone2
Bootloader: 0x0000
Radio: unknown 
<snip>
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 487344 kB
MemFree: 10436 kB 
<snip>

All-in-One

Make a big ball with everything together, from logcat to dumpstate:

$ bugreport > /mnt/sdcard/bugreport.txt

I’m pretty sure you really want to redirect that last command… xD

Something about permissions

P.S.: Naturally, access to those information may require root, as most of the sources are located on internal storage.

Log-File locations

There are several directories where logs (including those from crashes) might appear — not all of them are standardized (i.e. some may be ROM-specific).

  • /data/anr: Some trace files seem to get here (Dalvik writes stack traces here on ANR, i.e. «Application Not Responding» aka «Force-Close»; see e.g. log excerpts here)
  • /data/dontpanic seems to be a standard location (AOSP), and contains some crash logs including traces (see e.g. viaForensics and StackOverflow)
  • /data/kernelpanics is another location — not having had any «kernel panic» on my Android devices, I saw no content there yet.
  • the /data/panic/panic_daemon.config may point to other locations configured — on my Droid 2 it mentions /sdcard/panic_data/
  • mentioned Droid 2 also has a /data/panicreports directory (empty here)
  • /data/tombstones may hold several tombstone_nn files (with nn being a serial, increased with every new file). As tombstones are placed for the dead, it is done here for «processes died by accident» (i.e. crashed) — and it is what is referred to as «core dumps» on Linux/Unix systems. However, not all apps create tombstones; this must be explicitly enabled by the developer (see Debugging Android Core Dumps).

There may be some more locations which escaped me; but as most logging is done on tmpfs, these data are lost with a reboot, and would not match the OPs question.

Log commands to use with a terminal app (or adb)

Several commands can get you tons of information. For most of them, it is to recommend to re-direct them to a file (> filename.ext) or pipe them through a filter (| grep search-for-this):

Kernel log

The following works without root:

$ dmesg
<6>[82839.126586] PM: Syncing filesystems ... done.
<7>[82839.189056] PM: Preparing system for mem sleep
<4>[82839.189361] Freezing user space processes ... (elapsed 0.05 seconds) done.
<4>[82839.240661] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
<snip>

Logcat

Here you can e.g. specify what area you are interested in — radio, events…

# logcat -b events
I/am_create_service( 3457): [1085416560,nitro.phonestats/.widget.WidgetProvider4x1$WidgetUpdateService4x1,,3721]
I/am_destroy_service( 3457): [1085416560,nitro.phonestats/.widget.WidgetProvider4x1$WidgetUpdateService4x1,3721]
I/notification_cancel( 3457): [nitro.phonestats,4,0] 
<snip>

Getting device info

And tons of it: Device specifics, account information, services…

$ dumpsys
Currently running services:
  LocationProxyService
  SurfaceFlinger
  accessibility
  account
  activity
<snip>
DUMP OF SERVICE account:
Accounts:
  1 Account {name=xxxxxxx@googlemail.com, type=com.google}
<snip> 

$ dumpstate
========================================================
== dumpstate: 2012-08-18 23:39:53
========================================================

Build: Gingerbread GWK74 - CyanogenMilestone2
Bootloader: 0x0000
Radio: unknown 
<snip>
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 487344 kB
MemFree: 10436 kB 
<snip>

All-in-One

Make a big ball with everything together, from logcat to dumpstate:

$ bugreport > /mnt/sdcard/bugreport.txt

I’m pretty sure you really want to redirect that last command… xD

Something about permissions

P.S.: Naturally, access to those information may require root, as most of the sources are located on internal storage.

Статья обновлена: 24 апреля 2019
ID: 13048

При обращении в техническую поддержку по продуктам для Android специалисты «Лаборатории Касперского» могут попросить вас создать лог-файл Android-смартфона. По умолчанию доступ к лог-файлам отключен. Для того чтобы получить доступ, включите режим отладки.

Как включить режим отладки

Для сбора технической информации на смартфоне разрешите режим отладки из инструментария для разработчиков. По умолчанию доступ к нему отключен. Чтобы получить доступ:

  1. В меню настроек нажмите пункт Об устройстве (О телефоне и т.п.).

Об устройстве

  1. Найдите пункт меню Номер сборки (он может находиться, например, в разделе Версия ПО).

Номер сборки

  1. Несколько раз подряд нажмите на Номер сборки, пока не появится сообщение «Вы разработчик».

Включение режима разработки

  1. Проверьте в настройках наличие нового пункта Для разработчиков.

Для разработчиков

  1. Войдите в раздел Для разработчиков и поставьте галочку в пункте Отладка через USB, затем подтвердите включение режима отладки.

Включение режима отладки

Как получить лог-файл

  1. Подключите мобильное устройство к компьютеру через утилиту adb, предварительно установив драйверы для утилиты. Инструкция в статье.
  2. Для запуска сбора логов введите команду:

adb logcat –v threadtime > c:log.txt

  1. Запустите приложение на мобильном устройстве и воспроизведите возникающую проблему.
  2. В командной строке для остановки сбора логов нажмите Ctrl+C на клавиатуре.

Работа в командной строке

  1. В корне диска С: найдите файл log.txt.

Файл с логом

Лог-файл будет создан.

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

В системном журнале Android есть много интересных вещей, которые полезны во многих отношениях.

  • найти коренные причины проблем
  • определить ненадлежащие приложения

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

Android 4.1 и новее

Предпочтительным способом является загрузка SDK и его использование adb logcat (требуется активировать «параметры разработчика» на устройстве).

Существуют приложения, доступные для просмотра полного системного журнала, однако они работают только на корневых устройствах или требуют ручного запуска команды, adb чтобы заставить их работать. Для получения дополнительной информации см. Этот вопрос.

Android 4.0 и старше

Вы можете либо загрузить SDK и использовать, adb logcat либо получить Logcat Extrem из Google Play Store, где журнал отображается прямо на вашем телефоне.

Расположение файла журнала

Существует несколько каталогов, в которых могут отображаться журналы (в том числе журналы о сбоях) — не все они стандартизированы (то есть некоторые могут быть привязаны к ПЗУ).

  • /data/anr : Некоторые файлы трассировки, похоже, попадают сюда (Dalvik записывает трассировки стека здесь в ANR, то есть «Приложение не отвечает» или «Force-Close»; см., Например, выдержки из журнала здесь )
  • /data/dontpanic кажется стандартным местоположением (AOSP) и содержит некоторые журналы сбоев, включая трассировки (см., например, viaForensics и StackOverflow )
  • /data/kernelpanics это другое место — у меня не было никакой «паники ядра» на моих устройствах Android, я пока не видел там никакого контента.
  • /data/panic/panic_daemon.config может указывать на другие места , сконфигурированных — на моем Droid 2 он упоминает /sdcard/panic_data/
  • упомянутый Droid 2 также имеет /data/panicreports каталог (здесь пусто)
  • /data/tombstones может содержать несколько tombstone_nn файлов ( nn будучи серийным, увеличивается с каждым новым файлом). Поскольку надгробные плиты размещаются для мертвых, это делается здесь для «процессов, погибших в результате аварии» (т.е. сбой) — и это то, что называется «дампами ядра» в системах Linux / Unix. Однако не все приложения создают надгробия; это должно быть явно разрешено разработчиком (см. Отладка дампов ядра Android ).

Может быть еще несколько мест, которые избежали меня; но поскольку большая часть записи ведется tmpfs , эти данные теряются при перезагрузке и не соответствуют вопросу OP.

Журнал команд для использования с терминальным приложением (или adb)

Несколько команд могут получить тонны информации. Для большинства из них рекомендуется перенаправить их в файл ( > filename.ext ) или передать через фильтр ( | grep search-for-this ):

Журнал ядра

Следующее работает без рута:

Logcat

Здесь вы можете, например, указать, в какой области вы заинтересованы — радио, события .

Получение информации об устройстве

И тонны этого: особенности устройства, информация об учетной записи, услуги .

Все в одном

Сделайте большой шар со всем вместе, от logcat до dumpstate:

Я уверен, что вы действительно хотите перенаправить эту последнюю команду . xD

Что-то о разрешениях

PS: Естественно, для доступа к этой информации может потребоваться root, так как большинство источников находятся во внутренней памяти.

Как посмотреть логи на андроиде

CatLog — Logcat Reader
версия: 1.6.0

Последнее обновление программы в шапке: 09.02.2015

Прикрепленное изображение

Прикрепленное изображение

Краткое описание:
Программа для чтения и записи логов запущенных процессов.

Описание:
Возможность записи отдельных логов (ошибки, стабильно проходящие процессы и т.д.)

Сообщение отредактировал artem1701 — 19.04.18, 16:41

А если телефон вдруг ребутнул, я разумеется ничего не успел нажать (в смысле Save) и при новой загрузке catlog уже не активен. Можно ли ещё сохранить логи? Целы ли они в самом «катлоге».

Сорри, он кажись и так уже записывает на карту. а то раньше в каталоге катлога ничего не было.

Сообщение отредактировал Arth67 — 26.01.12, 14:21

Список изменений:
версия: 1.3.2
‪ — CatLog can be launched from external Intents. Details: сайт разработчика.
‪версия: 1.3.1
‪ — New «Default Log Level» setting.

Урок 12. Логи и всплывающие сообщения

Создадим в main.xml экран, знакомый нам по прошлым урокам про обработчики:

Алгоритм приложения будет тот же. По нажатию кнопок меняется текст. Обработчик — Activity.

Сохраним, запустим. Убедимся, что все работает.

Логи приложения

Когда вы тестируете работу приложения, вы можете видеть логи работы. Они отображаются в окне LogCat. Чтобы отобразить окно откройте меню Window > Show View > Other … В появившемся окне выберите Android > LogCat

Должна появится вкладка LogCat

Рассмотрим эту вкладку подробней. Логи имеют разные уровни важности: ERROR, WARN, INFO, DEBUG, VERBOSE (по убыванию). Кнопки V D I W E (в кружках) – это фильтры и соответствуют типам логов. Опробуйте их и обратите внимание, что фильтр показывает логи не только своего уровня, но и уровней более высокой важности. Также вы можете создавать, редактировать и удалять свои фильтры – это мы рассмотрим чуть дальше.

Давайте смотреть, как самим писать логи. Делается это совсем несложно с помощью класса Log и его методов Log.v() Log.d() Log.i() Log.w() and Log.e(). Названия методов соответствуют уровню логов, которые они запишут.

Изменим код MainActivity.java. Возьмем все каменты из кода и добавим в DEBUG-логи с помощью метода Log.d. Метод требует на вход тэг и текст сообщения. Тэг – это что-то типа метки, чтобы легче было потом в куче системных логов найти именно наше сообщение. Добавим описание тега (TAG) и запишем все тексты каментов в лог.

Eclipse ругнется, что не знает класс Log. Обновите импорт (CTRL+SHIFT+O) и, если спросит, выберите android.util.Log. Запустим приложение, понажимаем кнопки и посмотрим логи

Видно, что все отлично записалось. Чтобы сделать просмотр удобней, создадим свой фильтр. Жмем значок +

Имя фильтра произвольное, например, «My logs». Log Tag – это как раз значение константы TAG, которая описана в нашем коде и использовалась в методе Log.d, т.е. — «myLogs«. Pid оставляем пустым, это id процесса. Уровень поставим Debug

и жмем OK. Появилась новая вкладка My logs, на которой отображаются логи, соответствующие только что созданному фильтру.

Мы помещали в лог текст, но разумеется, вы можете писать, например, значения интересующих вас переменных (приведенные к типу String).

Иногда бывает, что логи не отображаются во вкладке LogCat, хотя AVD запущен, приложение работает без проблем. В таком случае должно помочь следующее: в Eclipse идем в меню Window > Open Perspective > Other > DDMS. Откроется немного другой набор окон чем обычно. Там найдите вкладку Devices и в ней должно быть видно ваше AVD-устройство, кликните на него и логи должны появиться. Чтобы вернуться в разработку: Window > Open Perspective > Java.

Всплывающие сообщения

Приложение может показывать всплывающие сообщения с помощью класса Toast. Давайте подредактируем метод onClick. Сделаем так, чтобы всплывало сообщение о том, какая кнопка была нажата.

Разберем синтаксис вызова. Статический метод makeText создает View-элемент Toast. Параметры метода:

context – пока не будем вдаваться в подробности, что это такое и используем текущую Activity, т.е. this.
text – текст, который надо показать
duration – продолжительность показа ( Toast.LENGTH_LONG — длинная, Toast.LENGTH_SHORT — короткая )

Toast создан и чтобы он отобразился на экране, вызывается метод show(). Сохраняем, запускаем, проверяем.

Если у вас есть Андроид-смартфон, я думаю вы уже видели подобные сообщения. Теперь вы знаете, как это делается )

На следующем уроке:

— создаем пункты меню

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Понравилась статья? Поделить с друзьями:
  • Как посмотреть журнал ошибок виндовс 10
  • Как посмотреть все ошибки компьютера
  • Как посмотреть все ошибки виндовс 10
  • Как посмотреть все ошибки windows
  • Как посмотреть error project zomboid