【问题标题】:Go Delve (1.0.0-rc2) freezes on Windows after breakpoint hit断点命中后,Go Delve (1.0.0-rc2) 在 Windows 上冻结
【发布时间】:2019-04-17 00:34:34
【问题描述】:

我最近遇到了一个问题,这使得使用 delve 调试 Go 几乎是不可能的。基本上我不能使用断点,否则调试的代码很有可能会冻结,我所能做的就是停止调试器重新启动。

从头开始...我在使用 GoLand IDE (2019.1) 和 delve (1.0.0-rc2) 调试 Go 时遇到了间歇性问题。整个会话将冻结 - 我知道什么都没有发生,因为调试的进程 CPU 使用率为零,并且没有消息写入日志的事实(我有很多 go-routines,其中大多数是偶尔写入日志消息) .就好像一个断点被击中但调试器命令(STEP 等)未启用,这表明调试器 not 在断点处。发生这种情况时,我必须点击 GoLand STOP 按钮 两次 以使调试器终止,然后重新开始。

最近这个问题变得更加普遍。从每天几次到几乎每个调试会话。这很烦人,但至少它让我能够找到我认为的根本问题。似乎有时当遇到断点时,调试器会停止但 delve 或 IDE 没有意识到 - 所以没有办法继续。

我怎么知道这个?我通过在日志行(即 log.Printf)上设置断点向自己证明了这一点。当断点在那条线上时(我知道它会被命中),那么调试会话就会冻结。如果我确保没有将被击中的断点,那么程序运行得非常好,包括打印日志行。如果我在日志行 after 行上设置(一个且唯一的)断点,则会打印日志行并冻结会话。

我认为这是 delve 的问题。请注意,我已经将同一个项目加载到 VSCode 中并且发生了完全相同的事情(GoLand 和 VSCode 使用相同版本的 delve),所以我不认为 GoLand 做错了什么。但如果有人有其他解释,我欢迎。

我已经尝试了很多方法来追查原因。我创建了一个小项目来演示这个问题,但它不会出现在一个简单的项目中。看来我做错了什么(在我的大型项目中)导致 delve 行为不端,但我不知道那是什么。

【问题讨论】:

  • 我仍然有这个问题,并且已经做了很多研究。有类似问题的提示,但似乎没有其他人遇到过这个与 delve 相关的巨大问题。我怀疑它与 Windows 相关(并且大多数都在 Linux 上运行调试器),所以我更改了标题以反映这一点。
  • 我现在用一个非常简单的项目重现了这个问题,如果有人感兴趣的话。

标签: go delve


【解决方案1】:

首先,1.0.0-rc2 对 Delve 来说似乎很古老:current version is 1.2.0

1.0.0-rc2 非常古老,以至于在 2018 年 8 月 (issue 1318) 报告了一个关于 delve 无头执行的类似错误:

dlv debug --headless ...

添加--log --log-output=rpc可以为您提供更多线索。

dlv debug --headless --listen=:2345 --api-version=2 --log --log-output=rpc ./test.go

在无头模式下,Delve 本身将忽略 SIGINT。
要停止无头实例,您必须连接到它,然后终止连接。
要将 SIGINT 发送到目标程序,您必须启动目标程序,而您没有启动目标程序,因为要启动目标程序,您必须先连接到 delve。

【讨论】:

  • 对不起,我忘了说我升级到了 1.2.0 并没有任何改变。感谢您提供有关 delve 命令行的信息 - 我会看看是否可以使用它。
  • 对不起,我应该给你赏金的。 (我没有意识到如果不使用它就会消失。)我打算将它增加到 100,但现在我知道它是如何工作的,我永远会再次使用赏金。
  • @AJR 没问题。希望这个答案可以帮助其他人。
  • 我的意思是我应该给你赏金,否则它被浪费了,你提供了一个有用的评论。 GoLand、VSCode 和命令行调试仍然会出现该问题,但使用最新的 Delve 似乎不太常见。
  • @AJR 没问题,仍然会感谢您的支持
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2016-07-06
  • 1970-01-01
  • 2020-03-25
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多