web-dev-qa-db-ja.com

swiftを使用したLLDBのpo

Swift LLDBのアプリで変数の値をプロットするにはどうすればよいですか?

以前は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(     
    ^
36
János

このエラーは、DWARFがLLDBに「自己」オブジェクトを見つける場所を指示していないためであると思われます。 Swiftの性質上、ローカルスコープ内に式を挿入できるように、LLDBはselfのタイプを知る必要があります。それが問題かどうかを確認する1つの方法は、LLDBプロンプトで行うことです。

(lldb)フレーム変数-L self

おそらく、その場所は表示されないでしょう。特定の再現ケースを追跡するために、バグレポートを提出する価値がある

とにかく、あなたの質問の大部分を得るために。 Swiftには、ObjCのような「印刷記述」のための言語認定メカニズムがありません。したがって、「po self」と入力できますが、selfがObjective-Cタイプでない限り、「p self 「または、「フレーム変数self」でさえもわかります-これは完全にLLDBデータフォーマッタメカニズムに基づいています。 Swiftオブジェクトの外観をカスタマイズするためにそれをフックしたい場合、必須の参照は次のとおりです。 http://lldb.llvm.org/varformats.html

18
Enrico Granata

Swiftでどのように機能するかを理解するためにいくつかのテストを行いましたが、結果は少し驚きました。 ObjCオブジェクトでは、podebugDescriptionを呼び出しますが、これはデフォルトでdescriptionを呼び出します。それは明らかです。残念ながら、Swiftクラスを操作しているときは同じことは適用されません。単一の変数を出力するのではなく、オブジェクトに焦点を合わせました。

動作させるには(polldbコマンド)説明をオーバーライドする必要がありました。テストに使用した以下のコード:

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

驚いたのは、po on Swift=オブジェクトがObjCとは異なるdescriptionではなくdebugDescriptionを呼び出すことです。

[〜#〜] edit [〜#〜]

ObjCのように動作させるには、クラスでCustomDebugStringConvertibleを実装する必要があり、その後podebugDescriptionを呼び出します。これはデフォルトでdescriptionを呼び出します。私の例で変更する必要があるのは、追加することだけです:

class Test : NSObject, CustomDebugStringConvertible

参照

XCode 7.0.1およびiOS SDK 9Swift 2.0で確認

4
Julian Król

Xcode beta4とフレーム変数-L selfについても同じエラーを確認できます

何かを表示しますが、最悪のようです:

:(SwiftCollectionViewSample.DetailViewController)self =

Enricoが最終的にバグを提出します

17819707デバッガーはエラーを出力します:未解決の識別子 '$ __ lldb_injected_self'の使用

1
ing.conti

このページのSwiftをデフォルト設定すると、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>
0
rustyMagnet