标题几乎概括了它。我正在尝试 Go,我真的很怀念能够在交互式环境中尽可能多地设置断点和步入/越过/退出。我知道我可以使用 gdb 来调试 Go,但与使用可以插入 gdb 进行断点的 IDE 相比,这非常烦人。
我尝试搜索一个,但只能找到具有语法突出显示但没有调试的插件或小型 IDE。
更新:就个人而言,虽然 GDB 可以工作,但我不喜欢在 Go 中使用它,它会让你吐血。查看其他一些答案以获得好的替代方案。
是的当然 :)
Go 有一个调试器(GDB)
这是有关如何使用它的官方教程。
如果您想要“图形调试”(即在编辑器中设置断点),一些 IDE 允许您这样做(在后台使用 GDB)。
具体来说,Eclipse、LiteIDE 和 Zeus 都允许您从编码环境(源代码)设置断点和调试。这是有关如何使用 Zeus 进行操作的视频。
GDB 对 go 的支持有很多 go 团队无法解决的问题。
有关更多信息,请阅读Rob Pike 的帖子:
尽管我们将努力保持基本的 gdb 功能(堆栈跟踪、打印值)在受支持的平台上工作,但使用调试器了解 Go 程序的完整环境的能力可能永远不会起作用,并且改进 gdb 支持不是团队的优先事项.
他们正在寻找其他调试选项,但目前还没有具体计划。文档已过时,runtime-gdb.py
go 1.2 附带的脚本不适用于使用 python3 支持编译的 GDB(例如当前的 Ubuntu)。
2017 年更新:下面提到的 godebug 项目现在正式被derekparker/delve取代。
原答案:
您现在(2015 年 3 月)有另一种方法,基于检测代码。
godebug
使用源代码生成为您的程序提供调试调用。
go tool cover
对代码覆盖率采用类似的方法。
- 当您运行时
godebug
,它会解析您的程序、检测函数调用、变量声明和语句行,并将结果代码输出到某处(当前为标准输出或原始文件上的位置)。- 当您运行此修改后的代码时,假设您在某处放置了一个断点,您可以单步执行它并检查变量。
稍后推出:评估任意 Go 表达式并写入变量。
2015 年 6 月更新:
虽然它可能不像“某些人”希望的那样具有交互性,但它仍然受到赞赏(并且具有“步入”功能)。
请参阅“ Go 有一个调试器——它很棒! ”(Cloudfare)
这是很酷的一点:与其与六个
ptrace
不可移植的不同接口搏斗,不如godebug
重写你的源代码并注入函数调用,就像godebug.Line
在每一行、godebug.Declare
每个变量声明和godebug.SetTrace
断点(即,无论你在哪里键入_ = "breakpoint"
)。我觉得这个解决方案很棒。
您从中得到的是一个(可能是交叉编译的)启用调试的二进制文件,您可以像使用常规二进制文件一样将其放在临时服务器上。当到达断点时,程序将停止内联并在标准输入上等待您。
我们喜欢将 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 等似乎提供的唯一价值是,您可以更快地确定 GDB 对 Go 的调试支持非常差。
您可以使用它来单步执行一些 Go 代码,但尝试打印除非常简单的变量值之外的任何值,您将浪费时间希望获得一个体面的调试器。
下面是一个示例,说明当您尝试使用 CGDB 打印 map[string]string 数据结构的值时会发生什么:
(gdb) print params
$1 = (github.com/go-martini/martini.Params) 0x15582 <runtime.reentersyscall+450>
...这完全没用。
接下来,试试这个:
(gdb) print params["UserID"]
...你会得到“总线错误”。
Delve ( https://github.com/derekparker/delve ) 看起来很有希望,因为它是用 Go 编写的,但是您使用控制台而不是通过 IDE 来驱动它。
我很乐意为支持 Go 交互式调试的企业版 IntelliJ(或任何其他 IDE)付费。
就目前而言,fmt.Printf("%v", variable)
几乎是最好的。
我很高兴使用 CGDB,一个围绕 GDB 的小诅咒包装器。
编辑
GO 调试器现在是 IntelliJ 或 PyCharm 中的一个简单插件,无需安装其他任何东西。只需在插件首选项中查找 Go 插件。
原始答案(2015 年 11 月)
对于那些寻找截至 2015 年 11 月的最新版本的人:
钻研
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)。
我个人使用选项 3。为此,您需要安装delve。
该视频展示了实际调试:https ://youtu.be/uBjoTxosSys?t=16m11s (整个视频非常有趣)。
IDE DEBUG ON 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 开发提供符合人体工程学的环境。