当我运行单元测试并想要调试某些东西时,我设置了一个断点并键入例如“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()
然后在您的主应用程序代码中(例如在
AppDelegate
或 SceneDelegate
中):#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
类型的配置(对调试器不喜欢的 Swift 和 GCC 进行编译器优化)。最后,确保您的方案的测试模式设置为使用正确的构建配置(在本例中为
Release
),如下面的屏幕截图所示。关于ios - LLDB:无法表达 IRGen,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43977271/