Способы отладки кода на языке Golang
25.01.23, Ср, 10:00, Мск,
Язык Golang еще относительно новый, и некоторые его нюансы пока не известны. Это может привести к проблемам при написании кода. В этой статье я рассмотрю различные способы отладки сервиса на Go перед его запуском, чтобы помочь Вам создать надежное и бесперебойное приложение для ваших пользователей.
Содержание |
Основная статья: Go (Golang)
Как и с любым другим языком, запуск сервиса требует не только аккуратно написанного кода, но и тщательной отладки перед предоставлением его пользователям. Восстановление ошибок и обнаружение проблем в работе приложения до его запуска является необходимым шагом для обеспечения стабильности и качества продукта.
Одним из стандартных вариантов отладки на языке программирования Go является использование оператора print. Другой вариант — отладчик GDB с открытым исходным кодом. Однако GDB не был создан для многих новых возможностей языка, таких как Goroutines и для решения этой задачи был разработан отладчик Delve. Другим вариантом является использование пакета Log для создания пользовательских журналов для вашего кода. Как и Вы можете понять, есть множество нюансов, которые стоит учитывать перед применением того или иного способа отладки, эта статья призвана помочь Вам с выбором и расширить Ваш список вариантов.
Delve
Простейшая форма отладки в любом языке программирования — это использование операторов print/logs и запись в стандартный out. Это, безусловно, работает, но становится чрезвычайно сложным, когда размер приложения увеличивается, а логика становится более комплексной. Добавлять операторы print в каждый участок кода приложения не так-то просто. Именно здесь на помощь приходят отладчики. Отладчики позволяют проследить путь выполнения программы с помощью точек останова и множества других возможностей. Delve - один из таких отладчиков для Go.
Delve - это проект с открытым исходным кодом, размещенный на GitHub. Это один из наиболее популярных вариантов, предлагающий простой в использовании и полнофункциональный инструмент для отладки Go. Чтобы начать работу с Delve, установите его на свою машину, используя следующую строку:
go install github.com/go-delve/delve/cmd/dlv@latest
Для macOS также потребуется установить инструменты разработчика. Инструкции можно найти в официальной документации. Проверить, установлен ли Delve на вашем компьютере, можно, введя в терминале команду dlv. Вы также можете проверить версию, набрав в терминале команду dlv version.
Чтобы узнать, что предлагает Delve, можно воспользоваться командой dlv help в терминале. Для отладки программы необходимо выполнить команду dlv debug. В конце этой команды следует указать имя файла, и отладка начнется. Например, если вы хотите отладить файл main.go, выполните команду dlv debug main.go. Этот процесс также известен как "Delve server", поскольку это запущенный процесс, ожидающий инструкций.
Вы также можете ознакомиться с (почти) полным списком команд Delve на Github.
Точка останова
Точки останова лежат в основе отладки. Они помогают останавливать и проверять переменные и другие выражения. Для добавления точек останова в код можно использовать команду break.
Например, если необходимо добавить точку останова в строке 4, выполните команду
break ./main.go:4
После того как точки останова будут добавлены, для их просмотра используйте команду breakpoints. Выполнение команды clearall очистит все точки останова.
При использовании команды continue отладчик будет выполнять код и остановится на следующей установленной вами точке останова. Если точки останова нет, то он будет выполняться до тех пор, пока программа не завершится.
Go предоставляет инструменты отладки, такие как GDB и Delve, которые поддерживают точки останова, межпакетные отладочные сессии и другие возможности, что делает точки останова еще более важными при отладке кода на Go, я выделю некоторые преимущества использования точек останова.
Позволяет исследовать проблему. При возникновении ошибок или неожиданного поведения, установка точки останова вблизи места возникновения проблемы позволяет программисту проанализировать состояние системы в этот момент и выявить причины проблемы.
Позволяет проверить значения переменных. Установка точки останова позволяет проверить значения переменных в определенном контексте исполнения программы. Это может быть особенно полезно при поиске ошибок, связанных с неправильным присвоением или использованием переменных.
Упрощает отладку синхронных и асинхронных операций: Go поддерживает многопоточность, поэтому разработчику может потребоваться отслеживать и анализировать состояние нескольких goroutine одновременно. Установка точек останова на разных этапах синхронизации и проверка значений переменных помогают обнаружить проблемы с синхронизацией или взаимодействием между goroutine.
Увеличивает производительность разработки: Использование точек останова позволяет программисту быстро изучить проблему, необходимую для исправления, вместо того чтобы перебирать весь код. Это экономит время и повышает эффективность разработки.
Более подробную информацию о командах можно найти в документации по Delve.
VS Code
Visual Studio Code - это интегрированная среда разработки (IDE). По данным Stack Overflow 2021, она считается самой популярной IDE среди разработчиков. Изначально она была создана компанией Microsoft в 2015 году, а затем выпущена в виде проекта с открытым исходным кодом.
Она позволяет создавать, редактировать и отлаживать программы. Если для выполнения кода на Go используется VS Code и в редакторе установлено официальное расширение Go, то отладка кода может осуществляться по нажатию клавиши F5 или Run and Debug на компьютере. Для этого необходимо установить Delve в качестве предварительного условия.
Чтобы установить Delve на VS Code, выполните комбинацию Ctrl+Shift+P или Cmd+Shift+P в Windows или Mac, выберите Go: Install/Update tools, найдите "dlv" и установите его.
Нажатие клавиши F5 или выбор пункта Run and Debug поможет начать отладку. Щелчок на области рядом с номерами строк позволит добавить точки останова в код.
Отладка в Visual Studio Code (VS Code) для языка Go имеет несколько преимуществ:
- Интегрированная среда разработки: VS Code - мощный текстовый редактор с поддержкой большого количества языков программирования. Он предоставляет широкий спектр функций и инструментов для удобной разработки, включая подсветку синтаксиса, автодополнение кода, эмуляцию терминала и многое другое.
- Нативная поддержка отладки: VS Code предлагает встроенный отладчик, который позволяет удобно отлавливать ошибки и проблемы в вашем коде Go. Он позволяет устанавливать точки останова, следить за значениями переменных, выполнять код пошагово и анализировать стек вызовов.
- Расширения и плагины: Богатая экосистема расширений и плагинов делает VS Code еще более мощным инструментом для разработки на языке Go. Существуют плагины, которые добавляют поддержку генерации кода, статического анализа, улучшенной поддержки модулей Go и других полезных функций.
- Легковесность: VS Code разработан с упором на производительность и производит меньшую нагрузку на систему по сравнению с некоторыми другими IDE. Это делает его отличным выбором для разработки на языке Go, особенно на слабых или медленных компьютерах.
- Кроссплатформенность: VS Code доступен для всех основных операционных систем, включая Windows, macOS и Linux, что позволяет разрабатывать на языке Go на любой платформе, удобной для вас.
Более подробную информацию можно найти на официальном сайте в разделе посвященном Go.
GoLand
GoLand - это интегрированная среда разработки (IDE) от компании JetBrains, предназначенная для языка программирования Go. Он предоставляет разработчикам широкий набор инструментов для эффективной разработки Go-приложений, включая редактор кода, отладчик, автоисправление кода, инструменты для форматирования и анализа кода, поддержку модулей и многие другие возможности. GoLand предоставляет графический интерфейс для отладки и работает с Delve.
Одним из главных отличий GoLand от других отладчиков является его интеграция с Go-специфичными инструментами, функциями и полную поддержку модулей Go, включая автоматическое обнаружение и загрузку модулей, а также интеграцию с go.mod файлами. Он также предоставляет возможность работать с инструментом gofmt для автоматического форматирования кода и поддерживает кодирование в стиле go vet и golint.
GoLand предлагает мощный отладчик, который позволяет разработчикам проверять и исправлять ошибки в своем коде. Он обладает возможностью шагать по коду, устанавливать точки останова, наблюдать значения переменных во время выполнения, а также предоставляет дополнительные средства для анализа стека вызовов, поиска goroutine и анализа производительности.
Чтобы запустить отладчик, можно либо щелкнуть на зеленом треугольнике и выбрать отладку, либо щелкнуть правой кнопкой мыши на папке и выбрать Debug. Более подробно об отладке с помощью GoLand компания JetBrains рассказывает в своем блоге.
Если вы предпочитаете графический интерфейс, а не CLI, то отладка с помощью VS Code или GoLand - отличный вариант. Они предлагают ту же функциональность, что и Delve, и имеют графический интерфейс.
goimports и gofmt
Пакет goimports в Go не является отладчиком, но он может помочь вам уменьшить количество ошибок, удалив их из кодовой базы. goimports добавляет недостающие импорты, сортирует их и группирует в собственные модули Go и модули сторонних разработчиков. Более подробную информацию можно найти в документации.
Аналогично, инструмент gofmt используется для проверки форматирования кода, что очень важно, поскольку Go-код чувствителен к форматированию.
В VS Code команда gofmt выполняется каждый раз при сохранении файла. Эти инструменты помогут вам избежать ошибок, выявляя мелкие ошибки, которые вы могли бы пропустить.
GDB
Обсуждая GBD, стоит обратить внимание на информацию с официального сайта:
GDB не очень хорошо понимает программы на языке Go. Управление стеком, потоками и временем выполнения содержат аспекты, которые настолько отличаются от модели выполнения, ожидаемой GDB, что могут запутать отладчик и привести к некорректным результатам даже при компиляции программы с помощью gccgo. Как следствие, хотя GDB и может быть полезен в некоторых ситуациях (например, при отладке Cgo-кода или отладке самой среды исполнения), он не является надежным отладчиком для Go-программ, особенно сильно параллельных. Более того, решение этих сложных вопросов не является приоритетным для проекта Go.
В преимущества использования GDB входит возможность реализации полной отладки. GDB позволяет отслеживать все процессы и нити в программе, включая выполнение их кода, изменение значений переменных и стекового состояния. Также, можно выделить мощные функции точек останова. GDB позволяет устанавливать точки останова в коде, чтобы отслеживать выполнение программы и проверять, выполняется ли код правильно на определенном месте. Возможность пошагового исполнения кода: GDB позволяет пошагово выполнять программу, чтобы проанализировать последовательность команд и их результаты, исследовать вызовы функций и т.д. Отдельного внимания заслуживает работа с ядрами: GDB позволяет работать с ядрами программы, сохраненными при сбое, что облегчает поиск и исправление ошибок. А также поддержка множества операционных систем: GDB поддерживает большое количество операционных систем, включая Linux, Windows, MacOS и другие, что упрощает процесс отладки независимо от выбранной ОС.
Однако стоит иметь в виду серьезные слабости использования GDB при отладке кода на Go:
- Ограниченная поддержка некоторых особенностей Go: GDB не всегда полностью поддерживает специфичные для Go функции и типы данных, такие как каналы, селекторы и пр.
- Неудобный синтаксис команд: синтаксис команд GDB может быть неудобным и не всегда интуитивно понятным, что может затруднять использование отладчика.
- Увеличение времени отладки: использование GDB может замедлить процесс отладки из-за необходимости взаимодействия с отладкой на низком уровне и множества дополнительных команд.
- Сложность настройки: настройка GDB для отладки Go-кода может потребовать некоторых дополнительных шагов и конфигурации, особенно при использовании оптимизации и определенных флагов компиляции.
- Ошибки и сбои: как и любое другое программное обеспечение, у GDB могут быть ошибки и сбои, которые могут затруднить или снизить эффективность процесса отладки.
Так когда же целесообразно использовать gdb? Во-первых, когда изменение кода не представляется возможным. Во-вторых, если при отладке проблемы, когда источник неизвестен, полезными могут оказаться динамические точки останова. А также, в заключении, при работе с большим количеством goroutine, когда возможность приостанавливать и проверять состояние программы может Вам помочь.
Отладчик gdb позволяет проверять скомпилированные двоичные файлы, если они были связаны с отладочной информацией, не изменяя исходный код. Это довольно мощная особенность, поскольку вы можете извлечь артефакт сборки из конвейера развертывания и отлаживать его в интерактивном режиме. Более подробно об этом можно прочитать в официальной документации.
Заключение
Эти инструменты отладки Go отличаются друг от друга по функциональности, используемым интерфейсам и интеграции со средой разработки. Выбор самого эффективного отладчика зависит от множества факторов, включая тип программного обеспечения, среду разработки, навыки разработчика и индивидуальные предпочтения.
Отладка на языке Golang является обязательным навыком для разработчиков. Использование инструментов отладки или IDE в программах на языке Go — это простой способ обеспечить работоспособность кода. Убедившись, что вы используете самый быстрый способ поиска ошибок, вы сэкономите бесчисленное количество часов и ресурсов на ее исправление, что позволит вам ускорить рабочий процесс и получить более качественный продукт.
Автор - Дмитрий Васянин, главный инженер по разработке ПО