LLDB:无法表达IRGen

时间:2017-05-15 10:34:14

标签: ios xcode lldb

当我运行单元测试并想要调试某些东西时,我设置了一个断点并输入例如“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

有关如何使其评估我的表达式的任何建议吗?

8 个答案:

答案 0 :(得分:19)

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

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

fr v world

答案 1 :(得分:12)

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

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

答案 2 :(得分:6)

编辑:

由于此答案引起了一定的关注,请注意,它仅描述了一种快速修复方法。
如果您经常遇到问题,请查看其他答案以寻求更永久的解决方案。
对我来说,清理build文件夹可以解决问题。
编辑2:在某些情况下,清洁无济于事,carthage update --platform iOS --no-use-binaries总是对我有用。

原始答案:

我有一个快速而又肮脏的解决方案,可以使这项工作奏效。

  • 选择调试导航器中的第一个可访问框架,通常为main enter image description here

  • 在调试器中键入内容,例如po self

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

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

如果您使用的是 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添加到测试目标中,则会导致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创建了测试配置,那么我们需要在{{1 }}:

Podfile

没有此设置,您的依赖项将使用默认的iOS配置(target 'MyApp' do # do it for MyAppTests also! project 'MyApp', 'App Store' => :release, 'Test' => :debug # ... pod dependencies, etc. end 类型的配置)构建(调试器将对SwiftGCC进行编译器优化'喜欢)。

最后,请确保将方案的“测试”模式设置为使用正确的构建配置(在这种情况下为Release),如下面的屏幕截图所示。

Xcode scheme config screen

答案 5 :(得分:0)

在我的情况下,我刚刚重启了Xcode,这很好:)

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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