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

Подключение к работающему процессу

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

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

Профиль

[profiles.attach]
adapter = "codelldb"
program = "target/debug/app"
mode = "attach"

[profiles.attach.launch_arguments]
pid = 4242

mode = "attach" на уровне профиля — это режим из DAP. program всё равно нужен: по нему адаптер находит отладочную информацию, — но ничего из него не запускается.

Найти pid:

pgrep -f my-app
ps aux | grep my-app

Сборки не происходит

В режиме attach сборка со стороны Bugsaur пропускается, и намеренно: процесс уже работает, а пересборка дала бы бинарник, не соответствующий тому, что исполняется в памяти.

Убедитесь, что бинарник в program — это та же сборка, что и работающий процесс. Отладочная информация от другой сборки даёт неверные номера строк и неверные переменные, а выглядит это как баг отладчика.

Pid, который каждый раз новый

Зашивать pid в коммитимый конфиг непрактично. Есть два обхода.

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

bugsaur gui --adapter codelldb --program target/debug/app \
  --launch-arguments "{\"pid\": $(pgrep -f my-app)}"

Или подключаться по имени, если адаптер это умеет — CodeLLDB умеет:

[profiles.attach.launch_arguments]
program = "my-app"
waitFor = true

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

По адаптерам

Адаптер Как подключаться
CodeLLDB pid либо program с waitFor
Delve mode = "attach" в launch_arguments плюс processId
debugpy connect к точке debugpy.listen() внутри процесса
PHP всегда по сути attach — адаптер слушает, Xdebug подключается

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

PHP эта страница не нужна

PHP-адаптер вообще ничего не запускает, поэтому любая PHP-сессия и так по духу является подключением. См. Языки → PHP.

Отключение

Остановка сессии — Cmd+F2 или :DebugStop — завершает сессию отладки. Останется ли при этом жив сам процесс или будет завершён, зависит от политики адаптера; для сервера, который вы не запускали, ожидайте, что он продолжит работать.

Если не работает

Симптом Причина Что делать
Permission denied ОС не разрешает подключаться к чужому процессу запустите с повышенными правами; на Linux проверьте ptrace_scope
Подключилось, но символов нет program — другая сборка укажите тот бинарник, из которого запущен процесс
Неверные строки и переменные та же причина см. выше
Pid исчез процесс перезапустился используйте waitFor или найдите новый pid