Как отлаживать программы Go с помощью GoClipse?

#eclipse #debugging #go #gdb #goclipse

#eclipse #отладка #Вперед #gdb #goclipse

Вопрос:

Я использую Go (go1.3 darwin / amd6) и GoClipse 0.8 на OS X Mavericks…

Возникли проблемы с запуском отладчика (после установки точек останова), поэтому я просмотрел Stack Overflow, а также остальной Интернет и обнаружил, что мне нужно установить gdb.

Следуйте следующим инструкциям (до конца) (установив gdb через HomeBrew):

http://ntraft.com/installing-gdb-on-os-x-mavericks/

Теперь, когда я устанавливаю точку останова и запускаю свою программу go через отладчик Eclipse, она выполняет ассемблерный код вместо кода Go:

например

Была установлена точка останова, чтобы эта строка внутри моей программы go:

 responses := [] *HttpResponse{}
  

Когда я запустил отладчик, он открыл файл с именем:

rt0_darwin_amd64.s

и строка кода, в которой он был установлен, была:

 MOVQ    $_rt0_go(SB), AX
  

И когда я попытался «перешагнуть» свой код, он продолжал делать это через эти файлы сборки…

Я не разбираюсь в ассемблере (и не думаю, что у меня есть время его изучать)… Существует ли простой способ отладки программы Go с помощью отладчика Eclipse?

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

1. Что происходит в текущем выпуске Go? Выпущен Go 1.3 , 18 июня 2014.

2. Я очень хорошо провел время, используя LiteIDE для интерактивной отладки моего кода Go. На Mac для этого потребовалась установка более новой версии GDB, которую можно выполнить с помощью Homebrew. Я полагаю, что у GoClipse может быть такое же требование на Mac.

Ответ №1:

Что отображается в режиме отладки, когда ваша программа Go останавливается? (Вид отладки — это то, что показывает вашу трассировку стека). Отображает ли он трассировку стека, подобную этой:

 Thread [1] 0 (Suspended : Breakpoint)   
    main() at rt0_windows_amd64.s:15 0x42a400   
    KERNEL32!BaseThreadInitThunk() at 0x773259ed    
    0x0 
  

(примечание: для OSX это было бы main() at rt0_darwin_amd64.s )

Если да, то вот что происходит: когда вы запустили программу, она автоматически остановилась в функции «main» при запуске программы. Но это не Go main, а скорее внутренняя функция «main» среды выполнения, код которой написан на C (и для которой нет доступных исходных текстов, вот почему вы видите ассемблер). Это контролируется первым параметром в параметрах конфигурации запуска, как вы можете видеть здесь: Параметры отладки

Вы можете изменить его на «main.main», чтобы остановиться на самом Go main, или просто снять с него галочку. В любом случае, если отладчик на этом останавливается, вы можете просто нажать Выполнить / Возобновить (F8), чтобы продолжить.

Ответ №2:

Я думаю, что происходит то, что отладочная информация удаляется из двоичного файла.

Убедитесь, что при компиляции двоичного файла в режиме отладки вы добавляете флаги, -gcflags "-N -l" задокументированные в http://golang.org/doc/gdb

Код, генерируемый компилятором gc, включает в себя встраивание вызовов функций и регистрацию переменных. Эти оптимизации иногда могут усложнить отладку с помощью gdb. Чтобы отключить их при отладке, передайте флаги -gcflags «-N -l» команде go, используемой для сборки отлаживаемого кода.