LLDB:无法 IRGen 表达式
LLDB: Couldn't IRGen expression
当我运行进行单元测试并想要调试某些东西时,我设置了一个断点并键入例如“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
关于如何让它评估我的表达式有什么建议吗?
您可以尝试使用 netx 命令:
取决于你在哪里安装 swift,在我的例子中是 /opt/swift/
sudo chmod 644 /opt/swift-3.1.1/usr/lib/swift/CoreFoundation/*
就我而言,我刚刚重新启动 Xcode,这很好 :)
我在使用 Carthage 框架时遇到了同样的问题,通过删除项目根目录中的 Carthage 文件夹并强制 Carthage 从源代码重建框架,让 LLDB 调试器再次工作:
carthage update --platform iOS --no-use-binaries
如果您正在使用 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 崩溃。
另一方面 note/tip,如果您需要在您的应用中使用任何依赖项,您需要通过启动参数更改主应用的 运行时间行为,而不是在你的测试代码。 (这是我偏离路径的地方,它给我带来了问题。)你可以通过将它添加到你的测试文件来做到这一点:
# 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 and GCC 进行编译器优化'不喜欢)。
最后,确保您的方案的测试模式设置为使用正确的构建配置(在本例中 Test
),如下面的屏幕截图所示。
由于 Instabug
框架,我遇到了完全相同的问题。
如果找不到解决方案,那么您应该通过 运行 调试器中的 log enable lldb expr -f /some/path/to/save/logs
命令导出 LLDB 日志,并检查该文件中的故障,因为这对我有帮助。
此外,您应该在 http://bugs.swift.org/ 上提交错误报告,并附上 LLDB 日志。
编辑:
由于此答案得到了一些关注,请注意它描述的只是一个快速修复。
如果您经常遇到此问题,请查看其他答案以获得更永久的解决方案。
对我来说,清理构建文件夹就可以了。
编辑 2:清洁在某些情况下没有帮助,carthage update --platform iOS --no-use-binaries
总是对我有用。
原答案:
我有一个快速但肮脏的解决方案可以使这项工作成功。
select 调试导航器中第一个可访问的框架,通常是 main
在调试器中输入一些内容,例如 po self
select 调试导航器中的原始框架并执行你的命令,它现在应该可以工作了
我不知道它为什么有效,但它对我有用。偶然发现的
我很想听听有更多见解的人的解释(我在我的项目中使用迦太基)。
您可能会收到此错误,因为您正在另一个 project/framework/module 中设置断点。
而不是 po world
,最快的解决方案是使用以下命令:
fr v world
CocoaPods Binary (https://github.com/leavez/cocoapods-binary) 对我造成了这个问题。最终删除它以解决问题。
当我运行进行单元测试并想要调试某些东西时,我设置了一个断点并键入例如“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
关于如何让它评估我的表达式有什么建议吗?
您可以尝试使用 netx 命令: 取决于你在哪里安装 swift,在我的例子中是 /opt/swift/
sudo chmod 644 /opt/swift-3.1.1/usr/lib/swift/CoreFoundation/*
就我而言,我刚刚重新启动 Xcode,这很好 :)
我在使用 Carthage 框架时遇到了同样的问题,通过删除项目根目录中的 Carthage 文件夹并强制 Carthage 从源代码重建框架,让 LLDB 调试器再次工作:
carthage update --platform iOS --no-use-binaries
如果您正在使用 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 崩溃。
另一方面 note/tip,如果您需要在您的应用中使用任何依赖项,您需要通过启动参数更改主应用的 运行时间行为,而不是在你的测试代码。 (这是我偏离路径的地方,它给我带来了问题。)你可以通过将它添加到你的测试文件来做到这一点:
# 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 and GCC 进行编译器优化'不喜欢)。
最后,确保您的方案的测试模式设置为使用正确的构建配置(在本例中 Test
),如下面的屏幕截图所示。
由于 Instabug
框架,我遇到了完全相同的问题。
如果找不到解决方案,那么您应该通过 运行 调试器中的 log enable lldb expr -f /some/path/to/save/logs
命令导出 LLDB 日志,并检查该文件中的故障,因为这对我有帮助。
此外,您应该在 http://bugs.swift.org/ 上提交错误报告,并附上 LLDB 日志。
编辑:
由于此答案得到了一些关注,请注意它描述的只是一个快速修复。
如果您经常遇到此问题,请查看其他答案以获得更永久的解决方案。
对我来说,清理构建文件夹就可以了。
编辑 2:清洁在某些情况下没有帮助,carthage update --platform iOS --no-use-binaries
总是对我有用。
原答案:
我有一个快速但肮脏的解决方案可以使这项工作成功。
select 调试导航器中第一个可访问的框架,通常是
main
在调试器中输入一些内容,例如
po self
select 调试导航器中的原始框架并执行你的命令,它现在应该可以工作了
我不知道它为什么有效,但它对我有用。偶然发现的
我很想听听有更多见解的人的解释(我在我的项目中使用迦太基)。
您可能会收到此错误,因为您正在另一个 project/framework/module 中设置断点。
而不是 po world
,最快的解决方案是使用以下命令:
fr v world
CocoaPods Binary (https://github.com/leavez/cocoapods-binary) 对我造成了这个问题。最终删除它以解决问题。