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(
^
このエラーは、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
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
驚いたのは、po
on Swift=オブジェクトがObjCとは異なるdescription
ではなくdebugDescription
を呼び出すことです。
[〜#〜] edit [〜#〜]
ObjCのように動作させるには、クラスでCustomDebugStringConvertibleを実装する必要があり、その後po
がdebugDescription
を呼び出します。これはデフォルトでdescription
を呼び出します。私の例で変更する必要があるのは、追加することだけです:
class Test : NSObject, CustomDebugStringConvertible
XCode 7.0.1
およびiOS SDK 9
、Swift 2.0
で確認
Xcode beta4とフレーム変数-L selfについても同じエラーを確認できます
何かを表示しますが、最悪のようです:
:(SwiftCollectionViewSample.DetailViewController)self =
Enricoが最終的にバグを提出します
17819707デバッガーはエラーを出力します:未解決の識別子 '$ __ lldb_injected_self'の使用
このページの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>