是否存在任何Go语言交互式调试器?

85

标题已经概括了主要内容。我正在尝试使用Go语言,但我非常想念在交互式环境中设置断点并随意执行/跳过/退出的能力。我知道可以使用gdb来调试Go语言,但与插入gdb进行断点调试的IDE相比,这相当麻烦。

我尝试搜索了一个,但只找到了插件或具有语法高亮但没有调试功能的小型IDE。


对于任何来到这个问题的其他人,请确保查看其他答案,而不仅仅是关于GDB的(目前已被接受的)答案。 - Leigh
9个回答

37
更新: 就我个人而言,在Go中使用GDB调试虽然可行,但我不喜欢它,它可能会让你气得吐血。可以查看其他答案以获得更好的替代方案。
是的,当然可以 :)
Go有一个调试器(GDB)
这里是如何使用它的官方教程
如果您想要“图形化调试”(即在编辑器中设置断点),一些IDE允许您这样做(在后台使用GDB)。
具体来说,Eclipse、LiteIDE和Zeus都允许您在编码环境中设置断点并进行调试(来源)这里有一个关于如何在Zeus中进行调试的视频

2
作为后续,我在使用Mac电脑,并发现IntelliJ的Go插件使得开发变得非常好用和简单,但LiteIDE在调试方面真的非常出色(虽然不完美但运行得非常好)。我确实不得不安装更新的GDB才能让它正常工作,这有点痛苦。 - Daniel Williams
4
它存在很多问题,并且除了基本功能外,未来不会得到 Go 团队的支持。请查看我下面的回答。 - metakeule
@user4839438,前两行文字直接写着“不要在Go上使用gdb”。我个人上次使用的是godebug,感觉还不错。 - Benjamin Gruenbaum
你说得没错,但标题是“Go有一个调试器(gdb)”,这实际上已经不再正确,而且现在是一种误导。GDB曾经可以与旧版本的golang一起使用,但尝试使其工作非常麻烦,最终它也无法工作,也不可能工作。我很满意Dwelve,我也会尝试godebug。 - Michele Giuseppe Fadda
随意发表答案 - 这个答案直接开头就是“个人而言,虽然 GDB 能用,但我不喜欢在 Go 中使用它,会让你吐血的。查看其他答案以获取更好的替代方案。” :) - Benjamin Gruenbaum
显示剩余2条评论

28

GDB对Go的支持存在很多问题,而这些问题不会由Go团队修复。

想了解更多信息,请阅读Rob Pike的帖子

虽然我们将尽力保持基本的gdb功能(堆栈跟踪,打印值)在受支持的平台上工作,但使用调试器来理解Go程序的完整环境的能力可能永远不会实现,并且改善gdb的支持并不是团队的优先事项。

他们正在寻找其他的调试选项,但目前没有具体计划。文档已经过时,随go 1.2一起提供的runtime-gdb.py脚本无法在编译有python3支持的GDB上工作(例如当前的Ubuntu)。


25
对于一门刚开始被采用的语言来说,这并不令人放心。 - Valerio
2
@ValerioColtrè 我在Go中从未需要过调试器。到目前为止,单元测试和Printf(“%#v”,...)已经足够好用了... - metakeule
21
没有人需要调试器,但是一个好的调试器可以在调试过程中证明非常有帮助并提高效率,特别是在调试失败的测试时。另外,调试器不会改变您的代码,而打印语句会改变它。 - gotgenes
根据GDB文档:“GDB不太理解Go程序。 栈管理,线程和运行时包含的方面与GDB预期的执行模型有足够的差异,甚至在使用gccgo编译程序时也可能会混淆调试器。 因此,尽管GDB在某些情况下可能很有用,但它不是Go程序的可靠调试器,特别是在并发性较强的情况下。” - masukomi
Go语言如何与调试器一起工作?Russ Cox曾经谈论过自定义Go调试器,但目前还没有实现。 - Ivan Chau

24

更新2017:以下提到的godebug项目现已由derekparker/delve正式替代。


原始回答:

现在(2015年3月),您有另一种基于代码注入的方法。

mailgun/godebug

godebug使用源代码生成来插入调试调用
go tool cover采用类似的代码覆盖率方法。

  • 当您运行godebug时,它会解析您的程序,插入函数调用、变量声明和语句行,并在某个地方输出结果代码(当前为标准输出或覆盖原始文件)。
  • 当您运行此修改后的代码时,假设您在某个地方设置断点,您可以逐步执行并检查变量。

即将推出:评估任意Go表达式并写入变量。


更新2015年6月:

虽然它可能没有“某些”人所希望的那么交互,但仍然受到赞赏(并具有“步入”功能)。
请参见“Go has a debugger—and it's awesome!”(Cloudfare)

这是很酷的一点:与其与不可移植的半打ptrace接口扭打,godebug重写您的源代码并在每行插入诸如godebug.Line的功能调用,在每个变量声明处插入godebug.Declare,以及在断点处(即您键入_ =“断点”的任何地方)插入godebug.SetTrace

我认为这个解决方案很棒。
从中获得的是一个(可能是跨编译的)启用调试的二进制文件,您可以像使用常规二进制文件一样将其放置在暂存服务器上

当达到断点时,程序将在行内停止并在标准输入上等待您。

这就是我们所喜爱的Go的单二进制零依赖哲学应用于调试。

ifdef GODEBUG  
    GOPATH="${PWD}" go install github.com/mailgun/godebug
    GOPATH="${PWD}" ./bin/godebug build -instrument "${GODEBUG}" -o bin/rrdns rrdns

调试只需要运行make bin/rrdns GODEBUG=rrdns/...即可。


Godebug现已被弃用,建议使用Delve代替。 - Alexandro de Oliveira
@AlexandrodeOliveira 谢谢。我已经相应地更新了答案。 - VonC
尝试使用Delve,似乎运行得相当不错。在我看来,这个像样的开源工具的答案使问题变得不那么“离题”。我理解不想评价闭源工具。也许问题需要重新表述,但我在寻找gdb的替代方案后发现它(gdb)并不是针对Go语言的最佳选择。 - Gerry Gleason

15

更新:

我已经检查过了,很高兴地报告说,版本号:2016.1.3,构建版本号:145.1617.8,发布日期:2016年6月5日与Delve兼容!您可以在此处下载:https://www.jetbrains.com/idea/download/。还要按照此处的Delve安装说明进行安装:https://github.com/derekparker/delve/tree/master/Documentation/installation

它有点不稳定。在我得到OSX登录提示后,交互式调试开始工作。有时,我必须调试一个简单的.go程序来启动它。但是它确实可以工作,并且是我见过的针对Go的最好的交互式调试体验。

原始帖子:

是否存在任何golang交互式调试器? 是的。

是否存在任何值得使用的golang交互式调试器? 没有。

在mac上配置GDB很繁琐,但可行。

然而,一旦你开始使用它,你很快就会意识到你只是在浪费时间安装它。

您甚至可以配置IntelliJ来使用它。

IntelliJ,LiteIDE,CGDB等唯一提供的价值似乎是可以更快地确定Go的GDB调试支持非常差。

您可以使用它来逐步执行一些Go代码,但是如果要打印除非非常简单的变量值之外的任何内容,否则将浪费时间渴望一个体面的调试器。

以下是使用CGDB打印map[string]string数据结构值时会发生的情况的示例:

(gdb) print params
$1 = (github.com/go-martini/martini.Params) 0x15582 <runtime.reentersyscall+450>

...这完全没有用。

接下来,试试这个:

(gdb) print params["UserID"]

......你将会得到"总线错误(Bus error)"。

Delve (https://github.com/derekparker/delve) 看起来很有前途,因为它是用 Go 写的,但是你需要通过控制台驱动它,而不是通过 IDE。

我很乐意为 IntelliJ(或其他任何 IDE)的企业版付费,只要它能很好地支持 Go 中的交互式调试。

目前为止,fmt.Printf("%v", variable) 已经是最好的选择了。


不再是了!过时的回答。 - Michele Giuseppe Fadda
mailgun/godebug是一个巨大的改进,值得使用。然而,非常值得使用的是一个具有集成的交互式调试器的IDE。从控制台进行调试让人想起80年代的调试。向我的Go代码添加仪表板是可行的,但有点侵入性。我宁愿只需(取消)单击一行代码即可(取消)设置断点。 - l3x
我将重新阐述... dvelve调试器 + IntelliJ IDEA集成开发环境! - Michele Giuseppe Fadda
嘿,user4839438,我刚刚注意到了你的帖子。我会试一下。如果有效,那么支付任何JetBrains升级费用肯定是值得的。虽然这对我来说并不重要,但我听说Delve调试器据说可以在MS Visual Studio中使用。请参见https://marketplace.visualstudio.com/items/lukehoban.Go - l3x
1
我已经检查过了,并且很高兴地报告,版本:2016.1.3,构建:145.1617.8,发布日期:2016年6月5日可以与Delve一起使用!您可以在此处下载:https://www.jetbrains.com/idea/download/。还要按照此处的Delve安装说明进行操作:https://github.com/derekparker/delve/tree/master/Documentation/installation - l3x

9

编辑

现在,GO调试器是IntelliJ或PyCharm中的一个简单插件,无需安装其他任何内容。只需在插件首选项中查找Go插件即可。

原始答案(2015年11月)

对于那些寻找截至2015年11月底最新信息的人:

获取Delve

https://github.com/derekparker/delve

并按照构建/设置说明进行操作:

https://github.com/derekparker/delve/wiki/Building

获取最新版本的IntelliJ(15)或PyCharm(5)

https://www.jetbrains.com/idea/download/

并在您选择的IDE中获取go-lang-plugin:

Pycharm -> Preference -> plugins -> search for go
current version is Version: 0.10.749
IntelliJ -> Preference -> plugins -> search for go
current version is Version: 0.10.749
  1. 设置一个新的Go项目或者导入一个项目。
  2. 按照提示设置您的Go SDK。
  3. 设置您的Go库(通常在GOROOT/src目录下)。
  4. 在右上角的“播放”图标旁边设置“运行应用程序配置”:
  5. 编辑配置 -> 点击 + -> Go应用程序

定义要运行的包或文件。

完成设置后,播放图标和调试图标现在应该是活动的,您可以像往常一样设置断点、监视器等等。

祝好


评估/监视对我无效: 找不到符号值... 你能解决这个问题吗? - Stefan Wuthrich - Altafino
观察和评估在PyCharm 5.0.3 CE和IntelliJ IDEA 15.0.2中对我来说似乎都很正常。 - MrE
您实际上不需要构建delve插件,该插件已经自动捆绑在其中。 - dlsniper
@dlsniper 这是最近的吗?当我尝试时,我已经安装了go插件一段时间了,我升级了,但在我构建delve之前它并没有起作用。 - MrE
@MrE Delve自从被集成以来已经随插件一起发布,大约是3个月前。但它只能在Linux和Mac OS X的64位系统上运行。 - dlsniper

8

8

Delve 落后了,但在我看来仍然比其他工具更好。 - Ostati
1
这在我看来是最好的答案。选项#3也是一个多平台的解决方案。Delve有一些限制,但基本的可视化调试效果相当不错。 - gideon

7

IDE调试程序在GO中是可能的(再次),而且实际上可行

Delve 在 Mac OS X 上工作得相当好,并且得到了IntelliJ IDEA Go Lang插件的支持。

我在 Mac OSX、IntelliJ Idea 14、Go 1.5.1、Delve 0.5 上进行了测试。

我必须通过创建自签名证书、将其添加到系统环境等常规步骤(在 Mac OS X 中运行调试器所需)来完成测试。最终,我在 IntelliJ 中设置了一个GO项目,并获得了通常的IDE+调试器功能:设置断点,检查变量,单步执行。

这比打印值以调试代码要好得多。


你能解释一下你是如何在IntelliJ中设置它的吗?调试器必须作为HTTP端点运行,是吗? - MrE
没事了...找到文档了等等...但是显然需要最新版本的PyCharm或IntelliJ才能开箱即用。 - MrE
我没有做任何特别的事情,只是安装了Dvelve和IntelliJ 14,它仍然可以在IntelliJ 15上正确运行。至于早期版本:我不知道。 - Michele Giuseppe Fadda

0

我一直很喜欢Gogland(https://www.jetbrains.com/go/),它基本上是带有Go支持的Intellij。它有一个工作中的调试器,随着他们的开发,它变得越来越好。我从2017年1月开始使用它,在我的2016 MBP上它大多数时间都很稳定。

Goland是JetBrains推出的新商业IDE代号,旨在为Go开发提供人性化的环境。


非常好!LiteIDE有点...太轻了。我喜欢IntelliJ,我会试试这个。 - Daniel Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接