LLDB中的po与swift

时间:2014-07-16 16:07:39

标签: swift lldb

如何在带有LLDB的Swift应用程序中绘制变量的值?

之前它就像po variable_name

现在我经常遇到一些令人讨厌的错误,例如:

(lldb) po a
error: <EXPR>:11:5: error: use of unresolved identifier '$__lldb_injected_self'
    $__lldb_injected_self.$__lldb_wrapped_expr_2(     
    ^

4 个答案:

答案 0 :(得分:18)

这个错误听起来可能是因为DWARF没有告诉LLDB在哪里找到你的&#34; self&#34;宾语。鉴于Swift的性质,LLDB需要知道self的类型才能在本地范围内注入表达式 找出这是否是您的问题的一种方法是在LLDB提示下进行:

(lldb)帧变量-L self

你可能不会看到它的位置。值得提交错误报告,只是为了追踪你的具体责备案例

无论如何,要解决你的大部分问题。在Swift中,没有语言认可的机制用于&#34;打印描述&#34;就像ObjC一样,所以虽然你可以键入&#34; po self&#34 ;,除非self是Objective-C类型,你几乎可以看到同样的事情&#34; p self&#34;甚至&#34;框架变量自我&#34;会告诉你 - 这完全基于LLDB数据格式化机制。如果您想要自定义Swift对象的外观,那么强制性参考是:http://lldb.llvm.org/varformats.html

答案 1 :(得分:3)

我做了一些测试来弄清楚它如何与Swift一起工作,结果让我感到有些惊讶。使用ObjC对象po调用debugDescription,默认情况下调用description。这很清楚。不幸的是,使用Swift类时同样不适用。我专注于对象而不是打印单个变量。

要使其工作(po中的lldb命令),我必须覆盖描述。我用于测试的代码如下:

class Test : NSObject
{
    var name : String?
    var surname : String?

    override var debugDescription : String{
        return "debugDescription method"
    }

    override var description : String {
        return "description Method"
    }
}

测试:

let test = Test()
test.name = "name"
test.surname = "surname"

(lldb) po test
description Method

(lldb) p test
(DebugTest.Test) $R1 = 0x00007fce11404860 {
  ObjectiveC.NSObject = {
    isa = DebugTest.Test
  }
  name = "name"
  surname = "surname"
}

(lldb) po dump(test)
▿ DebugTest.Test #0
  - super: debugDescription method
  ▿ name: name
    - Some: name
  ▿ surname: surname
    - Some: surname
description Method

(lldb) po print(test)
description Method

让我感到惊讶的是,Swift对象上的po调用description而不是debugDescription与ObjC不同。

修改

为了使其与ObjC一样,您的类必须实现CustomDebugStringConvertible,然后po将调用debugDescription,默认情况下会调用description。在我的例子中唯一需要改变的是添加:

class Test : NSObject, CustomDebugStringConvertible

Reference

选中XCode 7.0.1iOS SDK 9Swift 2.0

答案 2 :(得分:1)

对于Xcode beta4,我可以确认相同的错误  帧变量-L self

显示某些内容,但似乎最糟糕:

:( SwiftCollectionViewSample.DetailViewController)self =

我肯定会提交一个错误,Enrico

17819707调试器打印错误:使用未解析的标识符&#39; $ __ lldb_injected_self&#39;

答案 3 :(得分:0)

此页面中关于运行description时快速默认返回lldb) po的好答案

如果有帮助,当使用lldb和Swift对象遇到错误时,我总是想找个好地方。

首先,告诉lldb您处于Swift上下文中(不是Objective-C):

(lldb) settings set target.language swift

然后,我将始终仔细检查导入的框架。

lldb) exp import WebKit
(lldb) expr let $ds = unsafeBitCast(0x6000006d74b0, to: WKWebsiteDataStore.self)
(lldb) po $ds
<WKWebsiteDataStore: 0x6000006d74b0>