当我运行单元测试并想要调试某些东西时,我设置了一个断点并键入例如“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 go here”中设置了我的断点,当我运行时,我会执行“po world”:
(lldb) po world
error: Couldn't IRGen expression, no additional error

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

最佳答案

如果您使用的是 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()

然后在您的主应用程序代码中(例如在 AppDelegateSceneDelegate 中):
#if DEBUG
if CommandLine.arguments.contains("testing-enabled") {
    configureAppForTesting()
}
#endif
#if DEBUG 不是必需的,但最好不要发布不会在已发布的应用程序中执行的代码。

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

例如,如果我们基于 App Store 创建了一个名为 Release 的构建配置和一个基于 Debug 的测试配置,那么我们需要在我们的 0x251812241 中执行以下操作:
target 'MyApp' do # do it for MyAppTests also!
  project 'MyApp', 'App Store' => :release, 'Test' => :debug

  # ... pod dependencies, etc.
end

如果没有此设置,您的依赖项将使用默认的 iOS 配置构建,该配置是 Podfile 类型的配置(对调试器不喜欢的 SwiftGCC 进行编译器优化)。

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

ios - LLDB:无法表达 IRGen-LMLPHP

关于ios - LLDB:无法表达 IRGen,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43977271/

10-14 20:16