我最近遇到了一个问题,这基本上使得使用 delve 调试 Go 几乎是不可能的。基本上我不能使用断点,否则调试的代码很有可能会冻结,我所能做的就是停止调试器重新启动。
从头开始......我在使用 GoLand IDE (2019.1) 和 delve (1.0.0-rc2) 调试 Go 时遇到了间歇性问题。整个会话将冻结 - 我知道什么都没有发生,因为调试的进程 CPU 使用率为零,并且没有消息写入日志的事实(我有很多 go-routines,其中大多数是偶尔写入日志消息) . 就好像断点被击中但调试器命令(STEP 等)未启用,这表明调试器不在断点处。发生这种情况时,我必须按两次GoLand STOP 按钮才能终止调试器,然后重新开始。
最近这个问题变得更加普遍。从每天几次到几乎每个调试会话。这很烦人,但至少它让我能够找到我认为的根本问题。似乎有时当遇到断点时,调试器会停止但 delve 或 IDE 没有意识到 - 所以没有办法继续。
我怎么知道这个?我通过在日志行(即 log.Printf)上设置断点向自己证明了这一点。当断点在那条线上时(我知道它会被命中),那么调试会话就会冻结。如果我确保没有将被击中的断点,那么程序运行得非常好,包括打印日志行。如果我在日志行之后的行上设置(一个且唯一的)断点,则会打印日志行并且会话冻结。
我认为这是 delve 的问题。请注意,我已经将同一个项目加载到 VSCode 中,并且发生了完全相同的事情(GoLand 和 VSCode 使用相同版本的 delve),所以我不认为 GoLand 做错了什么。但如果有人有另一种解释,我欢迎。
我已经尝试了很多事情来追查原因。我创建了一个小项目来演示这个问题,但它不会出现在一个简单的项目中。看来我做错了什么(在我的大型项目中)导致 delve 行为不端,但我不知道那是什么。