Какие основные инструменты для отладки и профилирования приложений на Go вы знаете?

Ответ

Экосистема 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).