- Home »

Отладка кода Go в Visual Studio Code
Сегодня покажу, как обуздать отладку Go в Visual Studio Code. Это не просто «тыкать на кнопочки», а полноценная настройка инструмента, который может здорово упростить жизнь при разработке и сопровождении серверных приложений. Если вы деплоите Go-сервисы на продакшн, отлаживаете микросервисы или просто хотите перестать использовать `fmt.Println` для дебага — эта статья для вас.
Сразу отвечу на три главных вопроса: как работает отладчик Go в VS Code, как его быстро настроить и какие есть подводные камни. Плюс покажу реальные примеры использования и сравню с альтернативными решениями.
Как работает отладчик Go в VS Code
Под капотом VS Code использует расширение Go от Google Team, которое взаимодействует с Delve — де-факто стандартным отладчиком для Go. Delve умеет:
- Ставить breakpoints в коде
- Пошагово выполнять программу
- Инспектировать переменные и их значения
- Работать с горутинами
- Подключаться к уже запущенным процессам
Схема работы простая: VS Code → Go Extension → Delve → Ваше приложение. Delve компилирует код с отладочными символами и запускает в специальном режиме, где можно контролировать выполнение.
Быстрая настройка пошагово
Предполагаю, что у вас уже есть Go и VS Code. Если нет — качайте, ставьте, знаете сами.
Шаг 1: Устанавливаем расширение Go
Ctrl+Shift+X → ищем “Go” → устанавливаем от Google. Либо через командную строку:
code --install-extension golang.Go
Шаг 2: Устанавливаем Delve
Открываем командную палитру (Ctrl+Shift+P) и выбираем “Go: Install/Update Tools”. Отмечаем dlv и жмём OK. Или руками:
go install github.com/go-delve/delve/cmd/dlv@latest
Шаг 3: Создаём конфигурацию отладки
Переходим в папку проекта, создаём `.vscode/launch.json`:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"env": {},
"args": []
}
]
}
Шаг 4: Тестируем
Создаём простой `main.go`:
package main
import "fmt"
func main() {
name := "World"
greeting := fmt.Sprintf("Hello, %s!", name)
fmt.Println(greeting)
}
Ставим breakpoint на строке с `fmt.Println` (клик слева от номера строки) и жмём F5. Программа остановится на этой строке, и вы увидите значения переменных.
Практические примеры и кейсы
Кейс 1: Отладка веб-сервера
Допустим, у нас есть простой HTTP-сервер, который ведёт себя странно:
package main
import (
"fmt"
"net/http"
"strconv"
)
func handler(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
userID, err := strconv.Atoi(id)
if err != nil {
http.Error(w, "Invalid ID", http.StatusBadRequest)
return
}
// Здесь может быть баг с отрицательными числами
if userID < 0 {
userID = 0
}
fmt.Fprintf(w, "User ID: %d", userID)
}
func main() {
http.HandleFunc("/user", handler)
http.ListenAndServe(":8080", nil)
}
Конфигурация для отладки веб-сервера:
{
"name": "Launch Web Server",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"env": {
"PORT": "8080"
},
"args": []
}
Ставим breakpoint в функции `handler`, запускаем отладчик и делаем запрос `curl http://localhost:8080/user?id=-5`. Видим, как переменные меняются пошагово.
Кейс 2: Отладка с аргументами командной строки
Для CLI-приложений часто нужно передать аргументы:
{
"name": "Launch with Args",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"args": ["--config", "/etc/myapp/config.yaml", "--verbose"]
}
Кейс 3: Подключение к работающему процессу
Иногда нужно подключиться к уже запущенному процессу на сервере:
{
"name": "Attach to Process",
"type": "go",
"request": "attach",
"mode": "local",
"processId": 12345
}
Или через интерфейс: выбираем процесс из списка.
Сравнение различных режимов отладки
Режим | Когда использовать | Плюсы | Минусы |
---|---|---|---|
auto | Обычная разработка | Универсальный, подходит для большинства случаев | Может быть медленнее для больших проектов |
debug | Быстрая отладка без оптимизаций | Быстрая компиляция, все символы сохранены | Производительность хуже |
test | Отладка тестов | Можно отлаживать unit-тесты | Работает только с тестами |
attach | Подключение к работающему процессу | Не нужно перезапускать приложение | Процесс должен быть собран с отладочными символами |
Полезные команды и горячие клавиши
Основные команды для работы с отладчиком:
# Сборка с отладочными символами
go build -gcflags="all=-N -l" -o myapp
# Запуск Delve напрямую
dlv debug .
dlv exec ./myapp
dlv attach 12345
# Команды внутри Delve
(dlv) break main.main
(dlv) continue
(dlv) next
(dlv) step
(dlv) print variableName
(dlv) goroutines
(dlv) goroutine 1 bt
Горячие клавиши в VS Code:
- F5 — запуск отладки
- F9 — toggle breakpoint
- F10 — step over
- F11 — step into
- Shift+F11 — step out
- F6 — pause
- Shift+F5 — stop debugging
Продвинутые возможности
Условные breakpoints
Правый клик на breakpoint → "Edit Breakpoint" → задаём условие:
userID > 100
Логированные breakpoints
Вместо остановки выводят сообщение в консоль:
User ID is {userID}
Отладка тестов
Конфигурация для тестов:
{
"name": "Debug Tests",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}",
"args": ["-test.run", "TestSpecificFunction"]
}
Отладка с Docker
Для контейнеризованных приложений можно использовать удалённую отладку:
# Dockerfile
FROM golang:1.21-alpine
RUN go install github.com/go-delve/delve/cmd/dlv@latest
EXPOSE 2345
CMD ["dlv", "--listen=:2345", "--headless=true", "--api-version=2", "exec", "./myapp"]
Конфигурация VS Code для удалённой отладки:
{
"name": "Remote Debug",
"type": "go",
"request": "attach",
"mode": "remote",
"remotePath": "/app",
"port": 2345,
"host": "localhost"
}
Альтернативные решения
Кроме VS Code есть и другие варианты:
- GoLand — мощная IDE от JetBrains с отличным отладчиком, но платная
- vim-go — для любителей Vim, использует тот же Delve
- Emacs с go-mode — для фанатов Emacs
- Командная строка Delve — для хардкорных разработчиков
По статистике GitHub, VS Code используют около 60% Go-разработчиков, GoLand — 25%, остальные инструменты делят оставшиеся 15%.
Подводные камни и решения
Проблема: Отладчик не останавливается на breakpoint
Решение: Проверьте, что код не оптимизирован. Добавьте в launch.json:
"buildFlags": "-gcflags=all=-N -l"
Проблема: Переменные показывают `
Решение: То же самое — отключаем оптимизацию компилятора.
Проблема: Медленная работа с большими проектами
Решение: Используйте режим `debug` вместо `auto`, настройте исключения для vendor-папок.
Проблема: Не работает с CGO
Решение: Установите GDB и используйте гибридный режим отладки.
Интеграция с CI/CD
Интересный факт: отладчик можно использовать не только для разработки, но и для анализа проблем в CI/CD. Например, можно запустить тесты с отладчиком и собрать coverage:
# В GitLab CI
debug_tests:
script:
- dlv test --headless --listen=:2345 --api-version=2 ./... &
- sleep 5
- curl -X POST http://localhost:2345/api/command -d '{"name":"continue"}'
Конечно, это больше для отладки самих тестов, но иногда бывает полезно.
Автоматизация и скрипты
Можно создать скрипт для быстрого запуска отладки разных сервисов:
#!/bin/bash
# debug.sh
SERVICE=$1
PORT=${2:-2345}
case $SERVICE in
"api")
dlv debug ./cmd/api --headless --listen=:$PORT --api-version=2
;;
"worker")
dlv debug ./cmd/worker --headless --listen=:$PORT --api-version=2
;;
*)
echo "Usage: $0 {api|worker} [port]"
exit 1
;;
esac
Для продакшн-серверов удобно держать отладочные версии бинарников отдельно и подключаться к ним при необходимости. Естественно, на VPS или выделенных серверах с достаточными ресурсами.
Заключение и рекомендации
Отладка Go в VS Code — это мощный инструмент, который стоит освоить любому разработчику. Основные рекомендации:
- Используйте для разработки — намного эффективнее, чем print-отладка
- Настройте для разных окружений — локальная разработка, тестирование, удалённая отладка
- Изучите горячие клавиши — это сэкономит кучу времени
- Не забывайте про условные breakpoints — особенно полезны в циклах
- Используйте для обучения — отличный способ понять, как работает чужой код
Для серверных приложений особенно полезна возможность подключения к работающему процессу — можно отлаживать проблемы прямо в продакшене (только осторожно!). А для микросервисов удобно настроить разные конфигурации для каждого сервиса.
В целом, потратив час на настройку, вы сэкономите десятки часов в будущем. Go + VS Code + Delve = профит.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.