调试时为什么要加“-a”

Why is "-a" added when debugging

我有一个带有 CGO 导入 (sqlite3) 的项目。当我 运行 一个带有调试的 Go 应用程序配置时 IDE 添加 -a 标志,这会导致所有内容都被重建。在我的例子中,它需要超过 40 秒才能启动 运行.

我在 Go 1.9 版本中使用 EAP 172.3968.42(9 月 4 日)

有没有办法告诉它不要添加 -a 标志?

当我 运行 没有调试并且没有添加标志时,编译需要 3 秒。 我不需要调试任何导入,只需要调试纯 Go 中的代码。

谢谢。

Gogland 将使用 "go build -a .... package/name ...." 构建调试二进制文件以便对其进行调试。如果你想要旧的行为,那么你需要进入设置 |构建、执行、部署 |调试器 |深入研究并切换重建传递依赖项。但是,不鼓励这样做,对于您遇到的任何调试问题,您需要先将其重新打开,然后再报告该问题。这是因为 Gogland 将绕过 Delve 在 运行 "dlv debug package/name" 时会做的事情。有希望在 Go 1.10 中提供更好的支持,但这也取决于 Go 团队的工作。

现在是更长的版本:

你是对的,由于改进了调试支持,使用 EAP 12+ 时编译速度有所降低。

Go 1.9 现在可以在关闭所有优化的情况下更好地编译传递依赖项,这意味着 Delve 可以在您的应用程序上更好地工作。

这意味着 GOPATH/pkg 和 GOROOT/pkg 中的所有内容都将重新编译以进行调试,以确保没有因优化而意外包含的包。

如果发生这种情况,那么您最终可能会得到一个无法调试的包,有时甚至可能是您的包之一。

不幸的是,由于“-a”的工作原理,构建优化目前不可缓存。这意味着 "go build -i -a -gcflags '-N -l' ... package/name ... " 目前是不可能的。

Delve 本身会在 运行 "dlv debug ... package/name .... " 时应用“-a”标志,因此,虽然您可以在 Gogland 中关闭“-a”标志,但我建议您不要这样做(或者您如果您遇到任何错误,则必须使用它重做调试会话,因为这不是 Delve 官方支持的模式。

link原刊,请见:https://youtrack.jetbrains.com/issue/GO-4249

希望这对您有所帮助。