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

时间:2013-05-11 00:18:45

标签: debugging go

标题几乎总结了它。我正在尝试Go,我真的很想能够在交互式环境中设置断点并在我想要的内容中进/出。我知道我可以使用gdb来调试Go,但与使用可以插入gdb进行断点操作的IDE相比,这非常令人讨厌。

我尝试搜索一个,但只能找到具有语法突出显示但没有调试的插件或小型IDE。

9 个答案:

答案 0 :(得分:38)

更新:就个人而言,虽然GDB工作,但我并不喜欢在Go中使用它,它会让你吐出一些血。查看其他一些好的替代方案的答案。


是的,当然:)

Go有一个调试器(GDB)

以下是关于如何使用它的the official tutorial

如果您想要'图形化调试'(即在编辑器中设置断点),某些IDE可以让您这样做(在后台使用GDB)。

具体来说,Eclipse,LiteIDE和Zeus都允许您从编码环境(source)设置断点和调试。 Here is a video on how to do it with Zeus

答案 1 :(得分:29)

GDB对go的支持有很多问题,不会被go团队修复。

有关详情,请参阅post by Rob Pike

  

虽然我们将努力保持基本的gdb功能(堆栈   工作在支持的平台上的痕迹,打印值,能力   使用调试器来理解Go程序的完整环境   可能永远不会工作,改善gdb支持不是优先考虑的问题   球队。

他们正在寻找其他调试选项,但目前还没有具体的计划。 文档已过时,runtime-gdb.py脚本随附1.2 对于使用python3支持编译的GDB(例如当前的Ubuntu)不起作用。

答案 2 :(得分:24)

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


原始答案:

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

mailgun/godebug

  

godebug使用源代码生成来通过调试调用来监控程序   go tool cover对代码覆盖采用了类似的方法。

     
      
  • 当您运行godebug时,它会解析您的程序,工具函数调用,变量声明和语句行,并在某处输出结果代码(当前是stdout或原始文件的原位)。
  •   
  • 当您运行此修改后的代码时,假设您在某处放置了断点,您可以单步执行它并检查变量。
  •   
     

稍后:评估任意Go表达式并写入变量。


2015年6月更新:

虽然它可能不像#34;有些"可能希望,它仍然受到赞赏(和has "step into" feature) 见" Go has a debugger—and it's awesome!" (Cloudfare)

  

这里很酷的一点:而不是与六个不可移植的ptrace接口进行摔跤,godebug重写你的源代码并注入像{{1}这样的函数调用}每行,每个变量声明godebug.Line,断点godebug.Declare(即你键入godebug.SetTrace的任何地方)。

     

我觉得这个解决方案很棒   你得到的是一个(可能是交叉编译的)启用调试的二进制文件,你可以像登录常规二进制文件一样放在登台服务器上。

     

当达到断点时,程序将停止内联并在stdin上等待你。

     

我们喜欢将Go的单二进制,零依赖关系哲学应用于调试。随处可构建,随处运行,无需服务器上的工具或权限。

_ = "breakpoint"
  

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

答案 3 :(得分:15)

更新:

我已经查看过了,很高兴报告该版本:2016.1.3,Build: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]字符串数据结构的值时会发生什么的示例:

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

......这完全没用。

接下来,试试这个:

(gdb) print params["UserID"]

...而且你会得到&#34;总线错误&#34;。

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

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

截至目前,fmt.Printf("%v", variable)的效果差不多。

答案 4 :(得分:9)

修改

  

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
  1. 设置新的Go项目,或导入项目。
  2. 根据提示设置您的SDK
  3. 设置你的Go库(通常在GOROOT / src
  4. 通过“播放”图标右上角设置“运行应用程序”配置:
  5. 编辑配置 - &gt;点击+ - &gt;去申请
  6. 定义要运行的包或文件。

    完成设置后,Play图标和Debug图标现在应该处于活动状态,您可以像往常一样设置断点,监视等。

    干杯

答案 5 :(得分:8)

我很高兴使用CGDB,一个围绕GDB的小诅咒包装。

答案 6 :(得分:7)

IDE调试可能(再次),实际工作

Delve在Mac OS X上运行良好,受IntelliJ IDEA Go Lang plugin支持。

我在Mac OSX上测试过,IntelliJ Idea 14,Go 1.5.1,Delve 0.5

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

这比打印输出值更好,以便调试代码。

答案 7 :(得分:7)

  1. 选项一 - GDB https://golang.org/doc/gdb

  2. Delve

  3. Visual Studio Code及其go plugin(仍然使用deve)。

  4. 我个人使用选项3.对于它,您需要安装delve

    此视频显示了正在进行的调试:https://youtu.be/uBjoTxosSys?t=16m11s(整个视频非常有趣)。

答案 8 :(得分:1)

我对Gogland(https://www.jetbrains.com/go/)非常满意,基本上是Intellij和Go支持。它有一个有效的调试器,随着他们一直在开发它而不断变得更好。我从2017年1月开始使用它,并且在2016 MBP上对我来说基本稳定。

  

Goland是JetBrains针对的新商业IDE的代号   为Go开发提供符合人体工程学的环境。