Go 为什么是-a「;调试时添加

Go 为什么是-a「;调试时添加,go,goland,Go,Goland,我有一个带有CGO导入(sqlite3)的项目。当我运行带有调试功能的Go应用程序配置时,IDE会添加-a标志,这会导致重建所有内容。在我的情况下,它需要超过40秒才能开始运行 我正在使用EAP 172.3968.42(9月4日)和Go 1.9版本 有没有办法告诉它不要添加-a标志? 当我在没有调试的情况下运行并且没有添加标志时,编译需要3秒钟。 我不需要调试任何导入,只需要调试纯Go格式的代码 谢谢。Gogland将使用“go build-a….package/name….”构建调试二进制文件

我有一个带有CGO导入(sqlite3)的项目。当我运行带有调试功能的Go应用程序配置时,IDE会添加-a标志,这会导致重建所有内容。在我的情况下,它需要超过40秒才能开始运行

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

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

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


谢谢。

Gogland将使用“go build-a….package/name….”构建调试二进制文件,以便对其进行调试。如果您想要旧的行为,那么您需要进入设置|构建、执行、部署|调试器|深入和切换重建可传递依赖项。但是,这是不鼓励的,对于任何调试问题,您都需要首先重新打开它,然后报告问题。这是因为Gogland将绕过Delve在运行“dlv debug package/name”时所做的操作。有计划在Go1.10中获得更好的支持,希望如此,但这也取决于Go团队的工作

现在,对于较长的版本:

没错,使用EAP 12+时,由于调试支持的改进,编译速度略有下降

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

这意味着GOPATH/pkg和GOROOT/pkg中的所有内容都要重新编译以进行调试,以确保没有任何包意外地包含在上的优化中

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

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

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

有关原始版本的链接,请参见:


希望这有帮助。

谢谢Florine:)。我禁用了它,构建时间恢复正常。对于我只需要调试Go代码的特殊情况,它会对我产生什么影响?没有对外部导入进行任何更改,也不需要调试它们。问题是,Go工具当前不理解在使用-a时不重新编译CGO依赖项,并且它尝试重新编译所有内容。虽然可以在不使用-a标志的情况下使用调试器,但如果调试器确实存在问题,则需要重新启用该功能。考虑一下从pkgA跳到pkgB的情况,pkgB启用了优化代码。在这种情况下,Delve将很难调试代码,这可能会导致bug(因此需要-a)。我知道这不太理想,但希望在围棋1.10中情况会有所改善。