Xcode 10.1上的“错误:无法表达IRGen,没有其他错误”的解决方案是什么?

问题描述 投票:3回答:2

我们有一个大项目,通过迦太基带来了很多依赖。每当我们尝试查看lldb调试器(p variablename)中的变量时,它就会给出一个错误:error: Couldn't IRGen expression, no additional error

没有一种解决方法非常好。我们可以使用--no-use-binaries运行迦太基来解决它,但它使构建需要花费相当长的时间。我们可以在一些变量上使用fr v,但不是全部。人们通过更改某些Swift目录的权限在以前版本的Xcode中解决了这个问题,但我在Xcode 10.1中找不到相应的目录。我看到有人说改变构建系统来回帮助他,但这对我们没有用。

所以我开始专门搜索Xcode 10.1上的解决方案。有没有其他人发现是什么导致了这个错误,和/或一个很好的解决方案?

swift xcode lldb carthage
2个回答
4
投票

我团队中的某个人分享了一个实际可行的解决方案(我不知道他是否发现了它或在其他地方找到它):

在AppDelegate didFinishLaunchingWithOptions方法的第一行设置断点。将此断点的操作设置为:po application

现在,当您运行应用程序时,调试器将在该断点处暂停,并将在lldb调试器窗格中显示此文本(使用您的应用程序名称而不是Foo):

note: Swift compiler options for Foo conflict with options found in other modules; Switching to a new expression evaluator for Foo, old $R variables are lost.

然后lldb调试器将正常工作,能够ppo变量和expr表达式。

我不知道它为什么会起作用,但它确实有效,而且可靠!


3
投票

目前有一个硬性要求,即用于构建源代码的swift编译器版本以及用于调试它的lldb版本必须来自同一工具链。目前,类型的swift调试信息只是内部swift编译器数据结构的序列化。它还取决于本地路径信息,这使得难以四处移动。

更改设计有一个长期的努力,但是现在每次更新工具时都必须重建所有二进制文件,并且不能使用预先构建的二进制文件。

不过,我有点惊讶这会导致日常问题。只有当您从Carthage中提取新来源或更新工具时,才需要进行完全重建。如果你比这更频繁地触发重建,可能没有正确跟踪依赖关系,因此更多的文件正在重建而不是需要?

© www.soinside.com 2019 - 2024. All rights reserved.