【发布时间】: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 上运行调试器),所以我更改了标题以反映这一点。
-
我现在用一个非常简单的项目重现了这个问题,如果有人感兴趣的话。