【问题标题】:LLDB: Couldn't IRGen expressionLLDB:不能 IRGen 表达式
【发布时间】:2017-10-14 02:34:50
【问题描述】:

当我运行单元测试并想要调试某些东西时,我设置了一个断点并键入例如“po myVariable”。我从 LLDB 得到的回复是:

error: Couldn't IRGen expression, no additional error

例子:

我在这里定义了最小的小单元测试:

class MyExampleTests: XCTestCase {
    func testLLDB() {
        let world = "World"
        print("Breakpoint goes here")
        print("Hello \(world)")
    }
}

我在“Breakpoint goes here”中设置断点,当我运行时,我执行“po world”:

(lldb) po world
error: Couldn't IRGen expression, no additional error

关于如何让它评估我的表达式的任何建议?

【问题讨论】:

  • 这些信息不足以提供有用的答案。你能举一个失败的例子吗?
  • 用上面的例子编辑
  • 你找到解决这个问题的方法了吗?我也面临同样的问题。
  • 某些文件/文件夹需要文件写入权限。我不知道究竟是哪个对象需要特权,所以我递归地设置了它。例如,要为所有用户授予所有权限,请执行以下操作:sudo chmod -R 777 /base_path_to_swift/swift_folder.

标签: ios xcode lldb


【解决方案1】:

我在使用 Carthage 框架时遇到了同样的问题,我通过删除项目根目录中的 Carthage 文件夹并强制 Carthage 从源代码重建框架来让 LLDB 调试器再次工作:

carthage update --platform iOS --no-use-binaries

【讨论】:

  • 清除 Carthage/Build 文件夹并重建依赖项也对我有帮助。
  • 这是一种解决方法,但是如果您使用大量依赖项,这可能会花费大量时间。我仍在寻找更好的解决方案。
  • 谢谢,刚刚成功。或许你能解释一下--no-use-binaries选项背后的魔力是什么?
  • @pjuzeliunas Carthage 默认会查找是否有预构建的框架(二进制文件)可供下载,因此它不必在您的计算机上本地构建它们。问题是那些预构建的框架不支持逐步调试,所以除非你在本地构建它们,否则调试会失败。
【解决方案2】:

您可能会收到此错误,因为您正在另一个项目/框架/模块中设置断点。

代替po world,最快的解决方案是使用以下命令:

fr v world

【讨论】:

  • 不确定这是我们收到此错误的原因。但解决方法有效,+1。
  • 不确定我是否应该运行 Jonathan Cabrera 发布的命令,但我尝试了 fr v world 而不是 po world 并且成功了!!
  • “po”、“vo”和“fr v”有什么区别?您什么时候使用其中一种?
  • @ReimondHill 好问题!我最好的建议是阅读每一个。看看这个 WWDC 视频是一个很好的起点:developer.apple.com/videos/play/wwdc2019/429——另外,当你在调试器中时,尝试使用po,如果这不起作用尝试p,然后最后尝试fr v。
【解决方案3】:

编辑:

由于这个答案得到了一些关注,请注意它只是一个快速修复。
如果您经常遇到问题,请查看其他答案以获得更持久的解决方案。
对我来说,清理构建文件夹就可以了。
编辑 2:在某些情况下,清洁无济于事,carthage update --platform iOS --no-use-binaries 总是对我有用。

原答案:

我有一个快速而肮脏的解决方案来完成这项工作。

  • 在调试导航器中选择第一个可访问的框架,通常是main

  • 在调试器中输入一些东西,例如po self

  • 在调试导航器中选择原始框架并执行您的命令,它现在应该可以工作了

我不知道它为什么有效,但它对我有用。我只是偶然发现的。
我很想听听有更多见解的人的解释(我在我的项目中使用 Carthage)。

【讨论】:

  • 这太疯狂了。谢谢你的帖子。这对我有用 Xcode 版本 11.5。
【解决方案4】:

如果您使用的是 CocoaPods,这可能适用于您。有两件事需要确保。

问题 1:确保您没有将 pod 依赖项添加到您的 Podfile 中的测试目标:

target 'MyApp' do
  project 'MyApp'

  pod 'Alamofire'
  # ... other pods ...

end

target 'MyAppTests' do
  project 'MyApp'
  inherit! :search_paths
  # Do not add your main app pods here
  # You can use pods for writing your test cases though (e.g. mocks)
end

在我的例子中,我有很多框架,其中至少有一个使用二进制文件,如果我将它添加到我的测试目标,会导致 LLDB 崩溃。

作为旁注/提示,如果您需要在应用程序中使用任何依赖项,则需要通过启动参数更改主应用程序的运行时行为,而不是在测试代码中执行操作。 (这是我偏离路径的地方,它给我带来了问题。)您可以通过将其添加到您的测试文件来做到这一点:

# When you launch your app (e.g. in `setUpWithError()`)
let app = XCUIApplication()
app.launchArguments = ["testing-enabled"]
app.launch()

然后在您的主应用代码中(例如在AppDelegate 或SceneDelegate 中):

#if DEBUG
if CommandLine.arguments.contains("testing-enabled") {
    configureAppForTesting()
}
#endif

#if DEBUG 不是必需的,但最好不要发布不会在已发布应用中执行的代码。

问题 2:如果您有自定义构建配置,请确保您的测试在 Debug 模式下运行。

例如,如果我们基于Release 创建了一个名为App Store 的构建配置和一个基于Debug 的测试配置,那么我们需要在Podfile 中执行以下操作:

target 'MyApp' do # do it for MyAppTests also!
  project 'MyApp', 'App Store' => :release, 'Test' => :debug

  # ... pod dependencies, etc.
end

如果没有此设置,您的依赖项将使用默认的 iOS 配置构建,该配置是 Release 类型的配置(带有调试器不喜欢的 Swift 和 GCC 的编译器优化)。

最后,确保您的方案的测试模式设置为使用正确的构建配置(在本例中为 Test),如下面的屏幕截图所示。

【讨论】:

  • 为了后代,我使用的 CocoaPods 版本是 1.9.1 和 Xcode 11.4。语法和功能将来可能会发生变化...
【解决方案5】:

就我而言,我刚刚重新启动了 Xcode,这很好:)

【讨论】:

  • 这是最被低估的答案,有道理...+1(SO AI 过滤掉了荣誉,想象一下我的震惊)
  • 并非如此。我从 13.5 升级到 13.6 Xcode,仍然是错误。我认为只是重新启动 Xcode 不太相关。
【解决方案6】:

您可以尝试使用 netx 命令: 取决于您安装 swift 的位置,在我的情况下是 /opt/swift/

sudo chmod 644 /opt/swift-3.1.1/usr/lib/swift/CoreFoundation/*

【讨论】:

  • 似乎 Swift 不再安装在 /opt/
  • 有人找到了新的 Swift 位置吗?
  • @tzuer Xcode 10 上的 Swift 位于 /usr/bin/swift。您可以通过在终端中输入which swift 来找到它的位置
  • 那么现在应该是哪个命令? sudo chmod 644 /usr/bin/swift/? 答案将chomod 644 应用于当前swift 版本的CoreFoundation 内的所有文件。有人知道CoreFoundation 在哪里吗?
  • 什么是“netx 命令”?为什么更改整个CoreFoundation目录的模式会修复“Couldn't IRGen expression”错误?
【解决方案7】:

CocoaPods Binary (https://github.com/leavez/cocoapods-binary) 给我造成了这个问题。最终将其删除以解决问题。

【讨论】:

    【解决方案8】:

    由于Instabug 框架,我遇到了完全相同的问题。

    如果您找不到解决方案,那么您应该通过在调试器中运行 log enable lldb expr -f /some/path/to/save/logs 命令导出 LLDB 日志并检查该文件中的故障,因为这对我有帮助。

    此外,您应该在 http://bugs.swift.org/ 上提交错误报告,并附上 LLDB 日志。

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 2013-10-20
      • 1970-01-01
      • 2019-07-13
      • 2017-07-18
      • 2014-06-21
      • 1970-01-01
      • 2019-02-24
      相关资源
      最近更新 更多