Xcode lldb错误:无法打印Swift变量 - 获取"$__lldb_injected_self.$__lldb_wrapped_expr_x"。

17

有时在调试器中尝试打印变量时,会出现以下错误消息:

error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it
    var $__lldb_error_result = __lldb_tmp_error
    ~~~~^~~~~~~~~~~~~~~~~~~~
    _

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

这是一个已知的lldb漏洞(https://bugs.swift.org/browse/SR-6156),但或许有人知道一个解决方法,在修复该漏洞之前可以使用它吗?

1个回答

42

你可以使用 lldb 调试器的打印功能来解决这个问题:

frame variable variablename

快速输入也可以使用简化语法

fr v variablename

自从XCode 10.2以来,支持更加简单的lldb语法。
v variable

更新 - 新的解决方法:

打印堆栈地址:

v -L variablename

po 类似于堆栈帧变量.property

 v -o variablename.property

像 Swift 一样的 p

e unsafeBitCast(address, to: ClassName.self)

更新2 - 新的解决方案 适用于Swift类作为Objc类包装器的情况。

例如:

v response
(HTTPURLResponse) response = 0x0000000283ba7640 {

如果v有效:

e -l objc -- (int)[0x0000000283ba7640 statusCode]
(int) $2 = 404

更新3打印Swift数组(这里是[Int]数组)

v -L arrayName
0x00007ff7b753a9a8: ([Int]) arrayName = 1169 values {
0x000060000295e7b0:   [0] = 1
...

然后
e unsafeBitCast(0x00007ff7b753a9a8, to: UnsafeMutablePointer<Array<Int>>.self).pointee[0].bitWidth

使用map也是可能的。

e unsafeBitCast(0x00007ff7b753a9a8, to: UnsafeMutablePointer<Array<Int>>.self).pointee.map{ $0.bitWidth }

我希望收到实际有用且有效的报告。谢谢。

关于这种功能的更多信息可以在此处找到:https://developer.apple.com/library/content/documentation/General/Conceptual/lldb-guide/chapters/C5-Examining-The-Call-Stack.html


6
比没有好,但使用起来仍然相当繁琐...我想知道为什么这个Swift的bug(?)这么长时间都没有被修复。 - Serzhas
2
这并没有解决问题。在其他代码库中打印变量是可行的,为什么现在不起作用?而且为什么它在其他代码库中能够工作? - I make my mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接