Сбор служебной информации для анализа ошибок

Стеки потоков

Стек потока представляет собой LIFO структуру, упорядоченный список методов в порядке их вызова потоком.

Дамп стеков потоков (Thread dump, стеки потоков) — это список потоков и их стеков.

Рекомендуется снимать стеки потоков, охватывающие весь период, в который возникает проблема. Для точной диагностики может потребоваться 5-7 стеков потоков с периодичностью 3-5 секунд.

Снятие стеков потоков утилитой jstack. Linux

Утилита jstack входит в JDK.

Опция "-F" утилиты jstack не используется, т.к. полученный снимок в большинстве случаев не показателен для поиска причин проблемы.

В примере:

  • приложение установлено в каталог /opt/naumen/nausd4;
  • Java установлена в каталог /opt/naumen/java.

Выполните следующие действия:

  1. Чтобы узнать PID процесса приложения, в терминале (с правами root или пользователя, от имени которого запущено приложение) выполните команду:

    pgrep -f /opt/naumen/nausd4

  2. Чтобы получить стеки потоков, в терминале (с правами пользователя, от имени которого запущено приложение) выполните команду:

    /opt/naumen/java/bin/jstack $PID > "/tmp/stack.$(date +%Y%m%d-%H%M%S).$PID.txt"

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

Удаленное снятие стеков потоков утилитой Java VisualVM

Утилита Java VisualVM (jvisualvm) входит в Oracle JDK.

Выполните следующие действия:

  1. Добавьте удаленное подключение.

  2. Перейдите на вкладку стеков Thread и нажмите Thread dump.

  3. Сохраните стеки потоков на диск.

Снятие стеков потоков с помощью Java Melody

В приложении необходимо включить мониторинг Java Melody, см. Мониторинг ресурсов, используемых приложением.

Выполните следующие действия:

  1. Войдите в приложение под суперпользователем.
  2. В адресной строке вместо .../sd/operator наберите .../sd/monitoring. Откроется окно мониторинга JavaMelody.
  3. В блоке Threads перейдите по ссылке Details. Откроется перечень потоков приложения.
  4. Внизу страницы перейдите по ссылке Dump threads as text.

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

Периодическое снятие стеков потоков. Linux

Чтобы настроить автоматическое периодическое снятие стеков потоков, выполните следующие действия:

  1. Создайте файл stack.sh.

    Значения переменных приведены для примера, измените значение переменных в соответствии с имеющейся инсталляцией приложения.

    Copy
    #!/bin/bash
    # Срок хранения стеков потоков в днях
    DAYS_TO_STORE=3
    # Расположение JAVA
    JAVA_HOME=/opt/naumen/java
    # Расположение стеков потоков
    STACK_PATH=/opt/naumen/mon/stack
    #Директория установки приложения
    APP_DIR=/opt/naumen/nausd4
    if [[ ! -d "$STACK_PATH" ]]; then
    mkdir -p "$STACK_PATH"
    fi
    # Поиск PID приложения
    PID=$(cat "$APP_DIR/tomcat/temp/catalina.pid")
    # Снятие стека потоков
    if [[ "$PID" =~ ^[0-9]+$ ]]; then
    stack_file="${STACK_PATH}/stack-$(date +%F-%H%M%S)-${PID}.txt"
    echo "PID: $PID" > "$stack_file"
    $JAVA_HOME/bin/jstack -l "$PID" >> "$stack_file"
    # Удаление старых стеков
    find "$STACK_PATH" -name "stack-*" -mtime +"$DAYS_TO_STORE" -delete
    else
    echo "Wrong PID: $PID"
    fi
  2. Сделайте данный скрипт исполняемым:

    chmod +x stack.sh

  3. Добавьте скрипт в crontab пользователя, от имени которого запущено приложение (crontab -e):

    */5 * * * * $SCRIPT_PATH/stack.sh

    где $SCRIPT_PATH путь до скрипта stack.sh

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

Дамп памяти

Дамп памяти (Heap dump) — это слепок текущего состояния памяти приложения, со всеми данными, обращающимися в нем в данный момент времени.

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

Формат файла: <имя_файла>.hprof

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

Дамп памяти можно получить при помощи утилиты jmap, входящей в Oracle JDK.

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

Получение дампа памяти. Linux

В примере:

  • приложение установлено в каталог /opt/naumen/nausd4,
  • Java установлена в каталог /opt/java.

Выполните скрипт:

Copy
#!/bin/bash
# Расположение JAVA
JAVA_HOME="/opt/naumen/java"
# Расположение файла дампа памяти
HEAP_DUMP=/tmp/heapdump.hprof
# Директория установки приложения
APP_DIR=/opt/naumen/nausd4/
# Поиск PID приложения
PID="$(pgrep -f "$APP_DIR")"
# Получение дампа
$JAVA_HOME/bin/jmap -dump:file=$HEAP_DUMP $PID
# Архивирование дампа
tar -czf $HEAP_DUMP.tgz $HEAP_DUMP

В результате будет сформирован файл /tmp/heapdump.hprof.tgz, содержащий дамп памяти приложения.

Сетевая статистика браузера (HAR)

HAR-файл — это лог сетевых HTTP запросов браузера (взаимодействия браузера с веб-приложением (веб-сайтом)).

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

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

Сбор сетевой статистики в Edge

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

  1. Откройте браузер и нажмите клавишу F12.
  2. Перейдите на вкладку "Сеть" (Network).
  3. Нажмите кнопку в форме зеленого треугольника "Начать сбор сетевого трафика (F5)" (Enable network traffic capturing (F5)).
  4. Совершите переход или выполните действия, во время которых возникает ошибка.
  5. Сохраните собранную статистику, нажав кнопку в форме дискеты рядом с "Начать сбор сетевого трафика".

Сбор сетевой статистики в Google Chrome

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

  1. Откройте "Инструменты разработчика" (Developer tools) одним из способов:
    • Меню браузера (в верхнем правом углу) → "Дополнительные инструменты" (More tools) → "Инструменты разработчика" (Developer tools).
    • Нажмите на клавиатуре Ctrl+Shift+I.
  2. Перейдите на вкладку "Сеть" (Network).
  3. Проверьте — круглая кнопка в левом верхнем углу панели инструментов должна быть красной. Если кнопка серая, нажмите ее, чтобы начать запись.
  4. Установите флажок "Сохранять журнал" (Preserve log).
  5. Нажмите на перечеркнутый круг, чтобы удалить лишние данные перед воспроизведением ошибки и записи информации сеанса.
  6. Совершить переход или выполните действия, во время которых возникает ошибка
  7. Нажмите на таблицу правой кнопкой мыши и выберите "Сохранить как HAR-файл с данными" (Save as HAR with content).

Сбор сетевой статистики в Firefox

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

  1. Откройте браузер и нажмите клавишу F12.
  2. Перейдите на вкладку "Сеть" (Network).
  3. Нажмите кнопку с иконкой корзина "Очистить" (Clear).
  4. Установите флажок "Непрерывные логи" (Persist Logs).
  5. Совершить переход или выполните действия, во время которых возникает ошибка
  6. Нажмите на таблицу правой кнопкой мыши и выберите "Сохранить все как HAR" (Save All as HAR).