Как отлаживать программы Go с помощью GoClipse?
Использую Go (go1.3 darwin/amd6) и GoClipse 0.8 на OS X Mavericks...
У меня были проблемы с запуском отладчика (после установки точек останова), поэтому я просмотрел переполнение стека, а также остальную часть Интернета и обнаружил, что мне нужно установить gdb.
Следуйте следующим инструкциям (к T) (установив 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?
2 ответа
Что отображается в представлении "Отладка", когда ваша программа Go останавливается? (Представление Debug - это то, что показывает трассировку вашего стека). Отображает ли он трассировку стека, подобную этой:
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
)
Если это так, то вот что происходит: когда вы запустили программу, она автоматически остановилась при "основной" функции при запуске программы. Но это не главная функция Go, а скорее внутренняя "основная" функция времени выполнения, код которой написан на C (и для которой нет доступного исходного кода, поэтому вы видите ассемблер). Это контролируется первой опцией в параметрах конфигурации запуска, как вы можете видеть здесь:
Вы можете изменить его на "main.main", чтобы остановиться на фактическом Go main, или просто снять галочку. В любом случае, если отладчик останавливается на этом, вы можете просто нажать Run / Resume (F8), чтобы продолжить.
Я думаю, что происходит то, что отладочная информация удаляется из двоичного файла.
Убедитесь, что при компиляции двоичного файла в режиме отладки вы добавляете флаги -gcflags "-N -l"
задокументировано в http://golang.org/doc/gdb
Код, сгенерированный компилятором gc, включает в себя вставку вызовов функций и регистрацию переменных. Эти оптимизации могут иногда усложнять отладку с помощью GDB. Чтобы отключить их при отладке, передайте флаги -gcflags "-N -l" команде go, используемой для построения отлаживаемого кода.