3

我在 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 代码:

例如

在我的 go 程序中设置了一个断点:

responses := [] *HttpResponse{}

当我运行调试器时,它打开了一个名为:

rt0_darwin_amd64.s

它设置的代码行是:

MOVQ    $_rt0_go(SB), AX

当我试图“跳过”我的代码时,它会通过这些汇编文件继续这样做......

我不知道汇编(并且不认为我有时间学习它)......有没有使用 Eclipse 调试器调试 Go 程序的简单方法?

4

2 回答 2

5

当你的 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 main,而是一个内部运行时“main”函数,其代码是用 C 编写的(并且没有可用的源代码,这就是你看到汇编程序的原因)。这由启动配置选项中的第一个选项控制,如您在此处看到的: 调试选项

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

于 2014-07-08T12:46:37.800 回答
1

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

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

gc 编译器生成的代码包括函数调用的内联和变量的注册。这些优化有时会使使用 gdb 进行调试变得更加困难。要在调试时禁用它们,请将标志 -gcflags "-N -l" 传递给用于构建被调试代码的 go 命令。

于 2014-07-10T15:39:21.790 回答