3

我最近遇到了一个问题,这基本上使得使用 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 行为不端,但我不知道那是什么。

4

1 回答 1

0

首先,1.0.0-rc2 对于 Delve 来说似乎很老套:当前版本是 1.2.0

1.0.0-rc2 太古老了,以至于在 2018 年 8 月(问题 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。

于 2019-07-07T04:06:29.073 回答