#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, используемой для сборки отлаживаемого кода.