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

Другие вопросы по тегам