错误:在NSAttributedString扩展名中使用未声明的类型'$ __ lldb_context'

时间:2017-02-07 03:20:37

标签: swift lldb

给出以下Swift代码,保存在bug.swift中,并使用Xcode 8.2.1或Xcode 8.3 beta 2:

import Foundation

protocol MyProtocol {
    func foo() -> String
}

extension MyProtocol {
    func foo() -> String {
        return "\(self)"
    }
}

extension String: MyProtocol {}
extension NSAttributedString: MyProtocol {}

let normal = "normal".foo()
let attributed = NSAttributedString(string: "attributed", attributes: [:]).foo()

运行以下命令:

swiftc -g bug.swift
lldb bug

LLDB启动。现在,运行这些命令,并观察输出。我通过9的地方,在您的bug.swift中传递包含return "\(self)"的行:

(lldb) target create "bug"
Current executable set to 'bug' (x86_64).
(lldb) b 9
Breakpoint 1: where = bug`(extension in bug):bug.MyProtocol.foo () -> Swift.String + 19 at bug.swift:9, address = 0x0000000100001e53
(lldb) run
Process 16370 launched: '/Users/zev/Desktop/bug' (x86_64)
Process 16370 stopped
* thread #1: tid = 0x31730e, 0x0000000100001e53 bug`MyProtocol.foo(self="normal") -> String + 19 at bug.swift:9, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100001e53 bug`MyProtocol.foo(self="normal") -> String + 19 at bug.swift:9
   6    
   7    extension MyProtocol {
   8        func foo() -> String {
-> 9            return "\(self)"
   10       }
   11   }
   12   
(lldb) po self
"normal"


(lldb) c
Process 16370 resuming
Process 16370 stopped
* thread #1: tid = 0x31730e, 0x0000000100001e53 bug`MyProtocol.foo(self=0x00007fff5fbff480) -> String + 19 at bug.swift:9, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100001e53 bug`MyProtocol.foo(self=0x00007fff5fbff480) -> String + 19 at bug.swift:9
   6    
   7    extension MyProtocol {
   8        func foo() -> String {
-> 9            return "\(self)"
   10       }
   11   }
   12   
(lldb) po self
error: <EXPR>:1:11: error: use of undeclared type '$__lldb_context'
extension $__lldb_context {                            
          ^~~~~~~~~~~~~~~

error: <EXPR>:18:5: error: use of unresolved identifier '$__lldb_injected_self'
    $__lldb_injected_self.$__lldb_wrapped_expr_2(     
    ^~~~~~~~~~~~~~~~~~~~~

我们第一次点击断点时,String符合MyProtocol,我们可以成功po self

然而,我们第二次达到断点时,NSAttributedString符合MyProtocol,而LLDB打印的是乱码而不是po self的预期输出。

为什么LLDB有时无法打印任何有用的内容?这是一个人为的例子,但我在LLDB的日常使用中一直遇到这种情况。

2 个答案:

答案 0 :(得分:2)

根据Swift错误报告程序上的this answer,该错误已在某个时间修复。我在Swift 5.2中进行了测试,并确认它已修复

答案 1 :(得分:0)

重新打开Xcode并清除项目后,错误消失了。