如何使用GoClipse调试Go程序?

时间:2014-07-03 18:54:54

标签: eclipse debugging go gdb goclipse

在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程序的简单方法?

2 个答案:

答案 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语言编写(并且没有可用的源代码,这就是你看到汇编程序的原因)。 这由启动配置选项中的第一个选项控制,如下所示: Debug options

您可以将其更改为" main.main"停止在实际的Go主页上,或者只是取消选中它。在任何情况下,如果调试器停在那里,您只需单击运行/恢复(F8)即可继续。

答案 1 :(得分:1)

我认为正在发生的事情是调试信息正从二进制文件中删除。

确保在调试模式下编译二进制文件时添加http://golang.org/doc/gdb中记录的标记-gcflags "-N -l"

  

gc编译器生成的代码包括函数内联   调用和变量注册。这些优化可以   有时候用gdb更难调试。要在禁用时禁用它们   调试,将标志-gcflags“-N -l”传递给go命令   构建正在调试的代码。