Подключение к работающему процессу¶
Отладить процесс, который уже работает, вместо того чтобы запускать новый.
Это нужно, когда интересное состояние возникает только после долгого старта, когда процесс — сервер, который не хочется перезапускать, или когда баг появляется только под реальной нагрузкой.
Профиль¶
[profiles.attach]
adapter = "codelldb"
program = "target/debug/app"
mode = "attach"
[profiles.attach.launch_arguments]
pid = 4242
mode = "attach" на уровне профиля — это режим из DAP. program всё равно
нужен: по нему адаптер находит отладочную информацию, — но ничего из него не
запускается.
Найти pid:
Сборки не происходит¶
В режиме attach сборка со стороны Bugsaur пропускается, и намеренно: процесс
уже работает, а пересборка дала бы бинарник, не соответствующий тому, что
исполняется в памяти.
Убедитесь, что бинарник в program — это та же сборка, что и работающий
процесс. Отладочная информация от другой сборки даёт неверные номера строк и
неверные переменные, а выглядит это как баг отладчика.
Pid, который каждый раз новый¶
Зашивать pid в коммитимый конфиг непрактично. Есть два обхода.
Назвать при запуске, через ручной режим:
bugsaur gui --adapter codelldb --program target/debug/app \
--launch-arguments "{\"pid\": $(pgrep -f my-app)}"
Или подключаться по имени, если адаптер это умеет — CodeLLDB умеет:
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 |