标题已经概括了主要内容。我正在尝试使用Go语言,但我非常想念在交互式环境中设置断点并随意执行/跳过/退出的能力。我知道可以使用gdb来调试Go语言,但与插入gdb进行断点调试的IDE相比,这相当麻烦。
我尝试搜索了一个,但只找到了插件或具有语法高亮但没有调试功能的小型IDE。
godebug
,感觉还不错。 - Benjamin GruenbaumGDB对Go的支持存在很多问题,而这些问题不会由Go团队修复。
想了解更多信息,请阅读Rob Pike的帖子:
虽然我们将尽力保持基本的gdb功能(堆栈跟踪,打印值)在受支持的平台上工作,但使用调试器来理解Go程序的完整环境的能力可能永远不会实现,并且改善gdb的支持并不是团队的优先事项。
他们正在寻找其他的调试选项,但目前没有具体计划。文档已经过时,随go 1.2一起提供的runtime-gdb.py
脚本无法在编译有python3支持的GDB上工作(例如当前的Ubuntu)。
更新2017:以下提到的godebug项目现已由derekparker/delve正式替代。
原始回答:
现在(2015年3月),您有另一种基于代码注入的方法。
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/...
即可。
更新:
我已经检查过了,很高兴地报告说,版本号: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)
已经是最好的选择了。
编辑
现在,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
定义要运行的包或文件。
完成设置后,播放图标和调试图标现在应该是活动的,您可以像往常一样设置断点、监视器等等。
祝好
选项一 - GDB https://golang.org/doc/gdb
Visual Studio Code 与其 go 插件(仍使用 delve)。
我个人使用第三种选项。您需要安装delve。
这个视频展示了调试过程:https://youtu.be/uBjoTxosSys?t=16m11s(整个视频都非常有趣)。
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+调试器功能:设置断点,检查变量,单步执行。
这比打印值以调试代码要好得多。
我一直很喜欢Gogland(https://www.jetbrains.com/go/),它基本上是带有Go支持的Intellij。它有一个工作中的调试器,随着他们的开发,它变得越来越好。我从2017年1月开始使用它,在我的2016 MBP上它大多数时间都很稳定。
Goland是JetBrains推出的新商业IDE代号,旨在为Go开发提供人性化的环境。