Перейти к содержанию

Чтение логов

Панель Logs — Ctrl+L — основной диагностический инструмент. Эта страница о том, как превратить её содержимое в диагноз.

Включайте категории в таком порядке

Начинайте узко и расширяйте по необходимости.

1. Session — смены фазы, старт и смерть адаптера, отказы DAP-запросов. Большинство проблем названы здесь прямым текстом, одной строкой.

2. Adapter — собственный stderr адаптера. Здесь появляются жалобы, специфичные для языка: отсутствующий модуль Python, расхождение версий Go, ненайденная разделяемая библиотека.

3. Program — stdout и stderr вашей программы. Полезно, чтобы убедиться, что программа вообще выполнялась, и понять, докуда дошла.

4. DAP — полная трасса запросов. Выключена по умолчанию как самая шумная.

Записи собираются даже при выключенной категории

Включить DAP можно после аварии и всё равно увидеть, что произошло. Воспроизводить сбой с включённой трассировкой не нужно.

Как читать хронологию

Метки времени отсчитываются от начала сессии — +MM:SS.mmm — и начинаются заново после разделителя ── новая сессия ──.

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

Здоровый старт выглядит примерно так:

+00:00.010 SESSION старт сессии, профиль "api"
+00:00.050 SESSION building
+00:02.100 SESSION адаптер dlv запущен (pid 43912)
+00:02.300 SESSION launch
+00:02.900 SESSION остановка на cmd/api/main.go:42

Какой строки не хватает, та и указывает, куда смотреть:

Последняя увиденная строка Проблема в
старт сессии конфиге или профиле
building компиляторе
адаптер запущен старте самого адаптера
launch теле запроса или программе

Долгий запрос сообщает о себе сам

Каждые 30 секунд неотвеченный запрос отмечается:

+00:30.001 SESSION запрос `launch` идёт 30 s (mode=debug, program=/repo/cmd/api):
                   dlv (pid 43912) ещё не ответил; таймаут через 90 s

Всё, что нужно для решения, есть в этой строке: сколько уже ждём, сколько осталось и какой процесс держит ответ. По pid его видно в ps:

ps -p 43912 -o pid,stat,etime,command

Если он занят компиляцией, ждать правильно — а лучше вынести сборку из сессии, см. Настройка → Профили. Если он простаивает, значит адаптер застрял и ответа уже не будет.

Буфер, копирование и сохранение

Лента держит последние 20 000 записей.

Действие Что делает
Copy копирует видимое, с учётом фильтров
Save пишет весь буфер, независимо от фильтров, в <проект>/.bugsaur/logs/<unix-мс>.log

Для отчёта о проблеме всегда пользуйтесь Save. Фильтры, скрывшие причину от вас, скроют её и от того, кто будет читать отчёт.

Прокрутка

Лента следует за хвостом. G отключает слежение, чтобы можно было читать, не уезжая вниз; Shift+G возвращает его и прыгает в конец.

Секретов в логе не бывает

Значения env не появляются — тела DAP-запросов не печатаются. Это инвариант, а не случайность: трассировку запросов нельзя расширять, не вычистив предварительно значения env. По той же причине в сообщении о долгом запросе есть только mode и program.

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

Что приложить к сообщению об ошибке

  1. Сохранённый файл лога — весь буфер.
  2. Нужный профиль из .bugsaur/config.toml.
  3. Версию адаптера:
dlv version
codelldb --version
python3 -m debugpy --version
  1. Чего вы ждали и что произошло вместо этого.