在OS X Mavericks上使用Go(go1.3 darwin / amd6)和GoClipse 0.8 ......
在运行调试器时遇到问题(在设置断点之后),所以我搜索了Stack Overflow和其他Internet,发现我需要安装gdb。
按照以下说明(到T)(通过HomeBrew安装gdb):
http://ntraft.com/installing-gdb-on-os-x-mavericks/
现在,当我通过Eclipse的调试器放置一个断点并运行我的go程序时,它会逐步执行汇编代码而不是Go代码:
e.g。
在我的go程序中设置断点:
responses := [] *HttpResponse{}
当我运行调试器时,它打开了一个名为:
的文件rt0_darwin_amd64.s
并且设置的代码行是:
MOVQ $_rt0_go(SB), AX
当我试图" Step Over"我的代码,它通过这些汇编文件继续这样做......
我不知道汇编(并且不认为我有时间学习汇编)...有没有一种使用Eclipse调试器调试Go程序的简单方法?
答案 0 :(得分:5)
当Go程序停止时,Debug视图会显示什么? (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
)
如果是这样,以下是正在发生的事情:当你启动程序时,它会自动停止在" main"程序启动时的功能。但那不是Go主要,而是内部运行时" main"函数,其代码用C语言编写(并且没有可用的源代码,这就是你看到汇编程序的原因)。 这由启动配置选项中的第一个选项控制,如下所示:
您可以将其更改为" main.main"停止在实际的Go主页上,或者只是取消选中它。在任何情况下,如果调试器停在那里,您只需单击运行/恢复(F8)即可继续。
答案 1 :(得分:1)
我认为正在发生的事情是调试信息正从二进制文件中删除。
确保在调试模式下编译二进制文件时添加http://golang.org/doc/gdb中记录的标记-gcflags "-N -l"
gc编译器生成的代码包括函数内联 调用和变量注册。这些优化可以 有时候用gdb更难调试。要在禁用时禁用它们 调试,将标志-gcflags“-N -l”传递给go命令 构建正在调试的代码。