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

Профили

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

version = 1
default = "api"

[profiles.api]
adapter = "dlv"
program = "cmd/api"

[profiles.worker]
adapter = "dlv"
program = "cmd/worker"

Поля профиля

Поле Обязательное Что это
adapter да id из каталога адаптеров: dlv, codelldb, debugpy, php
program да что отлаживаем; относительный путь считается от корня
adapter_command нет перебивает команду адаптера: он может лежать в vendor/, а не в PATH
cwd нет рабочий каталог; по умолчанию корень проекта
args нет аргументы командной строки отлаживаемого процесса
env_file нет файл с переменными окружения; путь от корня
env нет переменные окружения; перебивают и env_file, и унаследованное
launch_timeout нет секунд на стартовый handshake (launch / attach и configurationDone); по умолчанию 120
mode нет launch (по умолчанию) или attach
build нет чем собрать программу; перебивает сборку из каталога адаптеров
launch_arguments нет тело DAP как есть, поверх умолчаний адаптера

Что означает program в разных языках

Язык program — это
Rust, C/C++ собранный бинарник — сначала соберите сами
Go каталог пакета
Python скрипт
PHP каталог проекта

Выбор профиля

  • default — что запускается, когда имя не названо.
  • :DebugStart worker в Neovim, с дополнением имён по Tab из конфига.
  • bugsaur run --project . --profile worker в терминале.

Если профиль один, default не нужен. Если их несколько, а default не задан, запуск останавливается и перечисляет доступные, а не выбирает за вас.

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

Сборка перед запуском

Для адаптеров, сборку которых знает каталог — на практике это Go, — Bugsaur собирает программу сам, в фазе building, до старта адаптера, и отдаёт адаптеру готовый бинарник.

Результат кладётся в <корень>/.bugsaur/build/<имя программы>. Ключ — программа, а не профиль, поэтому два профиля одного бинарника переиспользуют одну сборку.

Перебить сборку в профиле:

[profiles.worker]
adapter = "dlv"
program = "cmd/worker"

[profiles.worker.build]
command = "go"
args = ["build", "-tags=dev", "-gcflags=all=-N -l", "-o", "{out}", "./cmd/worker"]

command и args по отдельности, а не одной строкой: в -gcflags=all=-N -l пробел находится внутри одного аргумента, и разбор строки потребовал бы правил кавычек ровно там, где ошибка тихо ломает отладочную информацию. {out} — путь собираемого бинарника, {program} — то, что названо в program.

Сборки не происходит в режиме attach, для адаптеров, сборки которых нет в каталоге, и когда профиль сам назвал адаптеру mode или program в launch_arguments — значит, запуск ведут руками.

Если сборка не удалась, сессия падает в failed с текстом компилятора, а адаптер не поднимается.

Таймаут запуска

Стартовый handshake — launch / attach и configurationDone — ждут 120 секунд по умолчанию. Часть адаптеров собирает программу внутри launch, а часть завершает запуск после configurationDone и отвечает на оба запроса вместе.

[profiles.api]
adapter = "dlv"
program = "cmd/api"
launch_timeout = 600

Приоритет: профиль → каталог адаптеров → 120 секунд. Остальных запросов, например threads и evaluate, это не касается: медленный evaluate — признак бага, а не большого проекта.

Пока идёт ожидание, долгий запрос отмечается в панели Logs каждые 30 секунд — с pid процесса, который держит ответ, и остатком времени. См. Логи и диагностика.

Когда таймаут поднимать не надо

Если сборка долгая всегда, вынесите её из сессии: соберите заранее и отдайте адаптеру готовый бинарник. Для Go это mode = "exec" — см. Языки → Go.

Аварийный выход: launch_arguments

launch_arguments уходит адаптеру как есть — поверх умолчаний каталога и поверх всего, что сгенерировал Bugsaur, включая program, cwd, args и env. Ключ заменяется целиком, а не сливается: написали там env — уйдёт именно он, а не объединение с env_file.

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