Удалённая отладка Golang
Недавно довелось столкнуться с необходимостью отладки (запуска дебагера) программы, которая работает в Docker-контейнере внутри Vagrant’а. Как оказалось, сделать это достаточно просто. Далее будет небольшая инструкция, как этого добиться.
-
Для удалённой отладки Goland предлагает использовать Delve. Поэтому, устанавливаем его.
-
Выполняем команду:
dlv debug --headless --listen=:1234 --api-version=2
Эта команда компилирует программу с отключением оптимизации, запускает и прикрепляет к ней дебагер. Дебагер запускается в не интерактивном режиме и слушает порт 1234 Есть альтернативный способ. Компилируем программу следующим образом:
go build -gcflags "all=-N -l" github.com/app/demo
(для Go версии 1.10+) либо:
go build -gcflags "-N -l" github.com/app/demo
- В Goland заходим в настройки конфигурации запуска (Run/Debug Configuration):
- Добавляем новую конфигурацию: Go Remote
Указываем host vagrant’а и порт, который использовали при запуске Delve (п. 2). Сохраняем, закрываем настройки
- Запускаем режим дебага в Goland (Run → Debug). После этого будет непосредственно запущена программа, и теперь к ней можно обращаться обычным образом (например, из браузера).
Пример команды, запускающей таким образом программу внутри докера:
docker run --name your_programm -p 8080:8080 -p 6789:6789 -v "$PWD":/your_package_name -e GOPATH=/your_gopath -w /your_package_name golang:1.10 bash -c "go build -gcflags='all=-N -l' your_package_name && ./bin/dlv --listen=:6789 --headless=true --api-version=2 exec ./your_programm"
Обратите внимание, что тут указывается два порта - для обычных запросов к программе (8080) и для delve (6789). Не забываем указать актуальный путь к dlv (в моём случае: ./bin/dlv).