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

Bri*_*dig 5 xcode lldb swift 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上专门搜索解决方案。是否有其他人发现导致此错误的原因,和/或对此问题有好的解决方案?

Nic*_* S. 14

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

在 Swift 项目中创建一个 Objective-C 文件。当它要求桥接头时点击是。

Test.h

#import <Foundation/Foundation.h>

@interface Test : NSObject

- (id)init;

@end
Run Code Online (Sandbox Code Playgroud)

Test.m

#include "Test.h"

@implementation Test

- (id)init
{
    return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

MyProject-Bridging-Header.h

#include "Test.h"
Run Code Online (Sandbox Code Playgroud)

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

所以我认为只需添加一个桥接头就可以作为一种解决方法......

但如果这不起作用:

在添加断点AppDelegate.swiftapplication: UIApplication, didFinishLaunching像这样,希望这有助于:

Xcode 中的断点

  • 太棒了,它对我解决了与 Amazon Amplify 框架相同的问题 (2认同)

Bri*_*dig 11

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

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

我不知道为什么会这样,但是它确实可以正常工作!

  • 不幸的是不适合我。从 firebase 和其他地方获取一些二进制文件。希望我知道是哪个模块导致了这个问题。 (2认同)

Jim*_*ham 5

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

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

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

  • 如果不成功导入模块依赖关系的完整树,lldb无法为表达式评估(或变量检查)构建快速上下文。lldb尝试建立一个通用上下文,其中包含已加载到正在运行的应用程序中的所有模块,因此您可以尝试使用任何模块。在您的情况下,这将失败。 (2认同)
  • 从Xcode 10开始,如果失败,我们将建立一个新的上下文,该上下文仅查看由包含您当前在调试器中停止的代码的模块导入的模块。如果该模块在导入结束时不包含第三方模块,则应该没问题。当然,除了您将无法访问该模块不可见的类型/变量/等。但是,如果当前模块确实导入了您的第三方依赖项,那么我们又遇到了同样的问题。 (2认同)
  • 对于“相同的工具链”:lldb包含swift编译器源代码的副本作为其构建的一部分。swift编译器源的副本以及用来构建代码的swiftc的副本必须是相同的源。 (2认同)
  • 我们正在解决这个问题,但我们正在使用 Rome (https://github.com/blender/Rome) 来缓存我们的框架,因为每次构建它们都会浪费大量开发人员的时间。是否有我们能够使用的解决方法来允许调试? (2认同)