我有一个带有 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 调试包/名称”时会执行的操作。希望在 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 官方支持的模式)。
有关原始问题的链接,请参阅:https ://youtrack.jetbrains.com/issue/GO-4249
希望这可以帮助。