我们有一个大型项目,通过迦太基引入了很多依赖项。每当我们尝试查看lldb调试器(p variablename)中的变量时,都会给出一个错误:error: Couldn't IRGen expression, no additional error
所有的变通方法都不是很好。我们可以使用--no-use-binaries来运行迦太基来绕过它,但是它使得构建花费了非常长的时间。我们可以对一些变量使用fr v,但不是所有变量。在以前的Xcode版本中,人们通过更改一些Swift目录的权限来修复这个问题,但我在Xcode10.1中找不到相应的目录。我听到有人说,来回改变构建系统对他有帮助,但这对我们不起作用。
因此,我专门开始在Xcode10.1上寻找解决方案。其他人有没有发现导致这个错误的原因,和/或一个很好的解决方案?
发布于 2019-03-06 04:14:34
我的团队中有人分享了一个实际有效的解决方案(我不知道是他发现的还是在其他地方找到的):
在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表达式。
我不知道为什么它能工作,但它能工作,而且很可靠!
发布于 2020-05-16 00:33:30
我和一位同事找到了一个解决方案:
在Swift项目中创建一个Objective-C文件。当它要求提供桥接头时,点击yes。
Test.h
#import <Foundation/Foundation.h>
@interface Test : NSObject
- (id)init;
@endTest.m
#include "Test.h"
@implementation Test
- (id)init
{
return self;
}
@endMyProject-Bridging-Header.h
#include "Test.h"现在:没有更多的error: Couldn't IRGen expression, no additional error,你可以再次调试。
所以我认为只需要添加一个桥接头就可以解决这个问题了。
,但如果这不起作用:
像这样在application: UIApplication, didFinishLaunching中的AppDelegate.swift中添加一个断点,希望这会有所帮助:

发布于 2019-02-21 02:53:17
目前有一个严格的要求,你用来构建源代码的swift编译器版本和你用来调试它的lldb版本必须来自相同的工具链。目前,类型的快速调试信息只是内部快速编译器数据结构的序列化。它还依赖于本地路径信息,这使得它很难移动。
有一个长期的努力来改变这种设计,但现在你必须在每次更新工具时重新构建所有的二进制文件,并且你不能使用预先构建的二进制文件。
然而,令我有点惊讶的是,这会导致日常问题。这种完全的重建只需要在你从迦太基拉出新的源代码或者更新你的工具时发生,这不应该经常发生。如果您触发重建的频率比这更高,可能是因为依赖关系没有得到正确的跟踪,所以重建的文件比需要的要多?
https://stackoverflow.com/questions/54776459
复制相似问题