我们有一个大型项目,其中有很多通过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上专门搜索解决方案。还有其他人发现导致此错误的原因和/或解决方案吗?
答案 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}}中添加断点,希望对您有所帮助:
答案 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调试器将正常运行,并能够p
,po
变量和expr
表达式。
我不知道它为什么起作用,但是它确实可以起作用!
答案 2 :(得分:3)
当前存在一个严格的要求,即用于构建源代码的swift编译器版本和用于调试它的lldb版本必须来自同一工具链。当前,类型的快速调试信息只是内部快速编译器数据结构的序列化。它也取决于本地路径信息,这使得它很难走动。
需要更长的时间来更改该设计,但是现在您每次更新工具时都必须重新构建所有二进制文件,并且无法使用预构建的二进制文件。
但是,这引起了日常问题,我感到有些惊讶。仅当您从Carthage提取新资源或更新工具时才需要进行完全重建,这种情况不应该经常发生。如果您触发重新构建的频率更高,则可能是由于无法正确跟踪依赖项,因此正在重建的文件超出了需要的数量?