Подтвердить что ты не робот

Как отлаживать программу, написанную на языке Go?

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

4b9b3361

Ответ 1

Обновить. В документации теперь есть официальная страница Отладка кода перехода с 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.v" в одинарных кавычках. Следствием этого является то, что заполнение вкладок переменных и имен функций не работает.
  • Лексическая информация о области обзора несколько запутана. Если имеется несколько переменных с одним и тем же именем, n-й экземпляр будет иметь суффикс формы '#n. Мы планируем исправить это, но потребуются некоторые изменения в данных, обмен которыми происходит между компилятором и компоновщиком.
  • Срезные и строковые переменные представлены как их базовая структура в библиотеке времени выполнения. Они будут выглядеть примерно так: {data = 0x2aaaaab3e320, len = 1, cap = 1}. Для срезов вы должны разыменовать указатель данных для проверки элементов.

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

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

Ответ 2

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

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

Функции

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

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

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

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

$ dlv -run

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

$ dlv -proc path/to/program

Предоставьте pid текущего запущенного процесса, и отладчик присоединяется и начинает сеанс.

$ sudo dlv -pid 44839

Breakpoints

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

Ответ 3

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

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

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

hopwatch

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

with source

Ответ 4

Возможно, некоторые пошаговые инструкции для начала работы с 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.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

Разрабатывается другая технология отладки (Q4 2014): Трассировщик выполнения

След содержит

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

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

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