Как отладить программу, написанную на языке Go? - PullRequest
41 голосов
/ 04 августа 2010

Как мне отладить программу Go?Я использовал Gedit Go IDE , но у него нет отладки.Есть ли способ перешагнуть мой код и проверить память?Или я застрял с печатными заявлениями?Могу ли я использовать OutputDebugString ?

Ответы [ 9 ]

22 голосов
/ 01 апреля 2011

Обновление : теперь в документах есть официальная страница Отладка кода Go с помощью GDB . С момента написания этого ответа многое изменилось, и некоторые из перечисленных ниже ограничений были сняты. Я оставляю оставшуюся часть этого ответа для потомков, но если вы хотите отладить код Go, перейдите по ссылке выше.

Линкеры Go теперь генерируют символы отладки DWARF, которые можно интерпретировать с помощью GDB версии 7.x.

Выделите из сообщения в блоге, указанного выше:

Вы можете ...

  • загрузить программу Go в GDB версии 7.x
  • перечислить все исходные файлы Go, C и сборки построчно (части среды выполнения Go написаны на C и сборке),
  • установка точек останова по строке и пошаговое выполнение кода,
  • печатать трассировки стека и проверять кадры стека и
  • найти адреса и распечатать содержимое большинства переменных.

Есть еще некоторые неудобства:

  • Излучаемый код DWARF не читается GDB версии 6.x, поставляемой с Mac OS X. Мы с радостью примем исправления, чтобы сделать вывод DWARF совместимым со стандартной OS X GDB, но пока это не будет исправлено, вам потребуется загрузите, соберите и установите GDB 7.x, чтобы использовать его в OS X. Источник можно найти по адресу http://sourceware.org/gdb/download/. Из-за особенностей OS X вам потребуется установить двоичный файл в локальной файловой системе с chgrp procmod и chmod g + s.
  • В именах указывается имя пакета, и, поскольку GDB не понимает пакеты Go, вы должны ссылаться на каждый элемент по его полному имени. Например, переменная v в пакете main должна называться main.v в одинарных кавычках. Следствием этого является то, что завершение табуляции имен переменных и функций не работает.
  • Лексическая обзорная информация несколько запутана. Если существует несколько переменных с одним и тем же именем, n-й экземпляр будет иметь суффикс в форме «#n». Мы планируем это исправить, но для этого потребуются некоторые изменения в данных, которыми обмениваются компилятор и компоновщик.
  • Слайс и строковые переменные представлены в виде базовой структуры в библиотеке времени выполнения. Они будут выглядеть примерно так: {data = 0x2aaaaab3e320, len = 1, cap = 1}. Для срезов необходимо разыменовать указатель данных для проверки элементов.

Некоторые вещи не работают:

  • Невозможно проверить переменные канала, функции, интерфейса и карты.
  • Только переменные Go снабжены информацией о типе; переменные C времени выполнения не являются.
  • Двоичные файлы Windows и ARM не содержат отладочной информации DWARF и поэтому не могут быть проверены с помощью GDB.
13 голосов
/ 11 ноября 2014

Новая инициатива (началась в мае 2014 г.): derekparker/delve

Delve - отладчик Go, написанный на Go .
(в основном для Linux, поддержка OsX идет, поддержка Windows неизвестно поддерживается в 2016 г. )

Возможности

  • Присоединить к уже запущенному процессу
  • Запустить процесс и начать сеанс отладки
  • Установить точки останова, один шаг, функции перехода по очереди, напечатать содержимое переменной

Использование

Отладчик можно запустить тремя способами:

Скомпилировать, запустить и подключить за один шаг:

$ dlv -run

Укажите имя программы, которую вы хотите отладить, и отладчик запустит ее для вас.

$ dlv -proc path/to/program

Укажите pid запущенного в данный момент процесса,и отладчик присоединится и начнет сеанс.

$ sudo dlv -pid 44839

Точки останова

Delve может вставлять точки останова через точку остановаКоманда nt один раз внутри сеанса отладки, однако для простоты отладки вы также можете вызвать runtime.Breakpoint(), и Delve обработает точку останова и остановит программу на следующей исходной строке.

9 голосов
/ 03 июля 2013

Еще одна инициатива для начала отладочной сессии: hopwatch

В отличие от большинства отладчиков, в hopwatch требуется, чтобы вы вставляли вызовы функций в интересующие вас пункты вашей программы. В этих местоположениях программы вы можете указать Hopwatch отображать значения переменных и приостанавливать работу программы (или программы).
Hopwatch использует Websockets для обмена командами между вашей программой и отладчиком, работающим на странице HTML5.

(так что это все еще похоже на «оператор печати», но с более элегантным способом увидеть результат без загрязнения stdout и stderr)

hopwatch

Когда ваша программа вызывает функцию Break, она отправляет отладочную информацию на страницу браузера и ожидает взаимодействия с пользователем.
Используя функции Display, Printf или Dump (go-spew), вы можете регистрировать информацию на странице браузера.
На странице hopwatch разработчик может просмотреть отладочную информацию и выбрать возобновление выполнения программы.

with source

8 голосов
/ 31 мая 2011

Возможно, вам помогут некоторые пошаговые инструкции по началу работы с GDB.

Я создал silly.go, содержащий:

package main

import "fmt"

func x() {
    foo := 5
    fmt.Printf("foo: %v\n", foo)
}

func main() {
    go x()
    fmt.Printf("Done.\n")
}

После запуска 8g silly.go и 8l -o silly silly.8 я могу запустить gdb silly. (У меня есть «GNU GDB (Ubuntu / Linaro 7.2-1ubuntu11) 7.2», который, насколько я знаю, поставляется с Ubuntu 11.04 32 бит.)

Затем я могу набрать list, b 7 (сокращение от break 7) и run. Он останавливается на строке 7, и я могу запустить:

(gdb) p foo
$1 = 5

Было бы интересно посмотреть, будет ли отладчик Eclipse / CDT и / или DDD работать с Go.

4 голосов
/ 12 октября 2012

GDB 7.5 официально поддерживает Go.

3 голосов
/ 29 октября 2014

Еще одна разрабатываемая техника отладки (4 квартал 2014 года): Go Execution Tracer

Трассировка содержит

  • события, связанные с расписанием подпрограмм :
    • запускается выполнение подпрограммы на процессоре,
    • блокирует подпрограмму в примитиве синхронизации,
    • подпрограмма создает или разблокируетеще одна программа;
  • события, связанные с сетью :
    • блокирует подпрограмму в сети IO,
    • разблокируется в подпрограмме сети IO;
  • события, связанные с системными вызовами :
    • программа входит в системный вызов,
    • программа возвращается из системного вызова;
  • события, связанные с сборщиком мусора :
    • запуск / останов GC,
    • одновременный запуск / останов развертки;и
  • пользовательских событий .

Под «процессором» я подразумеваю логический процессор, единица измерения GOMAXPROCS.
Каждое событие содержит идентификатор события, точную метку времени, идентификатор потока ОС, идентификатор процессора, идентификатор goroutine, трассировку стекаи другая соответствующая информация (например, идентификатор разблокированного маршрута).

https://lh5.googleusercontent.com/w0znUT_0_xbipG_UlQE5Uc4PbC8Mw1duHRLg_AKTOS4iS6emOD6jnQvSDACybOfCbuSqr2ulkxULXGOBQpZ2IejPHW_8NHufqmn8q5u-fF_MSMCEgu6FwLNtMvowbq74nA

3 голосов
/ 04 августа 2010

К сожалению, сейчас лучший способ - использовать функции печати. Встроенные функции print и println будут работать, но функции в fmt иногда будут работать лучше, в зависимости от того, какую информацию вы ищете.

3 голосов
/ 04 августа 2010

Существует экспериментальный пакет отладчика, который называется ogle . Не уверен, насколько хорошо это работает.

0 голосов
/ 11 марта 2019

Получите Jetbrains Toolbox , загрузите GoLand, щелкните в левой части редактора, и он установит точку останова.

...