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

时间:2019-02-19 23:24:36

标签: swift xcode lldb carthage

我们有一个大型项目,其中有很多通过Carthage引入的依赖项。每当我们尝试在lldb调试器(p variablename)中查看变量时,都会给我们一个错误:error: Couldn't IRGen expression, no additional error

所有解决方法都不是很好。我们可以使用--no-use-binaries来运行迦太基来绕过它,但是这会使构建花费的时间过长。我们可以对某些变量使用fr v,但不能全部使用。人们已经通过更改某些Swift目录的权限在Xcode的早期版本中解决了此问题,但是我在Xcode 10.1中找不到相应的目录。而且我看到有人说来回更改构建系统对他有帮助,但这对我们没有用。

因此,我开始在Xcode 10.1上专门搜索解决方案。还有其他人发现导致此错误的原因和/或解决方案吗?

3 个答案:

答案 0 :(得分:10)

我和一位同事找到了解决方案:

在您的Swift项目中创建一个Objective-C文件。要求提供桥接标题时,单击是。

Test.h

#import <Foundation/Foundation.h>

@interface Test : NSObject

- (id)init;

@end

Test.m

#include "Test.h"

@implementation Test

- (id)init
{
    return self;
}

@end

MyProject-Bridging-Header.h

#include "Test.h"

现在::不再error: Couldn't IRGen expression, no additional error,您可以再次调试。

因此,我认为仅添加桥接标头即可解决此问题...

但是,如果这不起作用:

像这样在AppDelegate.swift的{​​{1}}中添加断点,希望对您有所帮助:

Breakpoint in Xcode

答案 1 :(得分:6)

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

在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表达式。

我不知道它为什么起作用,但是它确实可以起作用!

答案 2 :(得分:3)

当前存在一个严格的要求,即用于构建源代码的swift编译器版本和用于调试它的lldb版本必须来自同一工具链。当前,类型的快速调试信息只是内部快速编译器数据结构的序列化。它也取决于本地路径信息,这使得它很难走动。

需要更长的时间来更改该设计,但是现在您每次更新工具时都必须重新构建所有二进制文件,并且无法使用预构建的二进制文件。

但是,这引起了日常问题,我感到有些惊讶。仅当您从Carthage提取新资源或更新工具时才需要进行完全重建,这种情况不应该经常发生。如果您触发重新构建的频率更高,则可能是由于无法正确跟踪依赖项,因此正在重建的文件超出了需要的数量?