Обновить

Комментарии 2

горутины изнутри - хороший формат. а как с дебагом? у нас проблема была что стандартный линуксовый отладчик не понимает что внутри горутины, приходится через логи дебажить. как автор решает вопрос отладки?

То что стандартный дебаггер горутины сам не понимает, это позиция Go-команды: «GDB does not understand Go programs well … it is not a reliable debugger for Go programs» go.dev/doc/gdb. Как я уже писал в статье, горутина это структура в памяти процесса, спящая на канале горутина не лежит ни на одном потоке ОС, поэтому GDB её не видит.

Полумера: GDB умеет info goroutines и goroutine N bt через runtime-gdb.py из поставки Go, но по умолчанию скрипт не грузится, поэтому и не понимает что внутри. Лечится строчкой в ~/.config/gdb/gdbinit:

add-auto-load-safe-path /usr/local/go/src/runtime/runtime-gdb.py

Проверил: стеки спящих горутин показывает, но в списке все горутины выглядят как runtime.gopark, различать приходится по bt.

Есть рабочее решение, это Delve (go install github.com/go-delve/delve/cmd/dlv@latest). Он показывает каждую горутину с пользовательским фреймом и причиной ожидания переключается на заблокированную и печатает Go-типы нормально: jobs = chan main.order 0/0, o = main.order {ID: 1, Price: 9.99}. VS Code и GoLand дебажат через него же.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации