error: use of undeclared type '$__lldb_context' in NSAttributedString extension
error: use of undeclared type '$__lldb_context' in NSAttributedString extension
给定以下 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 的过程中一直都在研究这个。
重新打开 Xcode 并清除项目后错误消失。
根据 Swift 漏洞报告者的 this answer,该漏洞已在某个时间点得到修复。我在 Swift 5.2 中测试过,并确认它是固定的
给定以下 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 的过程中一直都在研究这个。
重新打开 Xcode 并清除项目后错误消失。
根据 Swift 漏洞报告者的 this answer,该漏洞已在某个时间点得到修复。我在 Swift 5.2 中测试过,并确认它是固定的