Профили¶
Профиль описывает одну отлаживаемую вещь: каким адаптером, какую программу и как запускать. Профилей у проекта столько, сколько у него частей, которые стоит отлаживать.
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 и отвечает на оба запроса
вместе.
Приоритет: профиль → каталог адаптеров → 120 секунд. Остальных запросов,
например threads и evaluate, это не касается: медленный evaluate — признак
бага, а не большого проекта.
Пока идёт ожидание, долгий запрос отмечается в панели Logs каждые 30 секунд — с pid процесса, который держит ответ, и остатком времени. См. Логи и диагностика.
Когда таймаут поднимать не надо
Если сборка долгая всегда, вынесите её из сессии: соберите заранее и отдайте
адаптеру готовый бинарник. Для Go это mode = "exec" — см.
Языки → Go.
Аварийный выход: launch_arguments¶
launch_arguments уходит адаптеру как есть — поверх умолчаний каталога и поверх
всего, что сгенерировал Bugsaur, включая program, cwd, args и env. Ключ
заменяется целиком, а не сливается: написали там env — уйдёт именно он, а
не объединение с env_file.
Это способ выразить то, чему нет поля в схеме профиля. Если приходится пользоваться им регулярно, скорее всего, в схеме не хватает поля.