Ответ
Экосистема Go предоставляет мощный встроенный инструментарий для отладки, профилирования и трассировки приложений.
1. Интерактивная отладка (Delve)
Delve (dlv
) — это стандартный де-факто отладчик для Go. Он позволяет:
- Устанавливать точки останова (breakpoints).
- Пошагово выполнять код.
- Просматривать и изменять значения переменных.
- Анализировать состояние горутин.
Он интегрирован во все популярные IDE (GoLand, VS Code).
# Запуск отладки
dlv debug main.go
# Внутри delve
(dlv) break main.main # Установить breakpoint
(dlv) continue # Продолжить до breakpoint
(dlv) print myVariable # Посмотреть переменную
(dlv) goroutines # Посмотреть список горутин
2. Профилирование (pprof)
pprof — встроенный пакет для сбора данных о производительности приложения. Он позволяет анализировать:
- CPU Profile: Какие функции потребляют больше всего процессорного времени.
- Heap Profile: Какие участки кода выделяют больше всего памяти.
- Goroutine Profile: Где и в каком состоянии находятся все горутины (полезно для поиска утечек горутин).
- Mutex Profile: Где происходят блокировки мьютексов.
Профайлер обычно подключается как HTTP-обработчик:
import _ "net/http/pprof"
func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// ... ваш код
}
После этого можно анализировать профиль через go tool pprof
.
3. Трассировка (Trace)
Go Execution Tracer (go tool trace
) — инструмент для визуализации выполнения программы. Он помогает находить проблемы с параллелизмом, задержками в планировщике Go и сборщике мусора.
4. Логирование
Структурированное логирование — важная часть отладки в продакшене. Популярные библиотеки:
zerolog
: Быстрый JSON-логгер с низким потреблением ресурсов.zap
: Разработан в Uber, также ориентирован на высокую производительность.log/slog
: Новый стандартный пакет для структурированного логирования (с Go 1.21).
5. Статический анализ
Инструменты, которые находят ошибки до запуска кода:
go vet
: Встроенный инструмент для поиска подозрительных конструкций.staticcheck
: Более мощный и продвинутый статический анализатор.
6. "Простая" отладка
Иногда для быстрой проверки достаточно вывести значение переменной или структуры с помощью fmt.Printf("%+vn", myStruct)
.