7

ファンキーなUIViewの動作でデバッグしようとしていますが、LLDBがまったく役に立たず、誤解を招く可能性があります。私が何を意味するかをお見せしましょう:

NSLog(@"myView: %@", myView);

2012-04-20 15:24:57.070 myProj[35789:f803] myView: <MyView: 0x7cc7500; frame = (0 119; 768 885); layer = <CALayer: 0x7cc8030>>

しかし、その瞬間にブレークポイントを設定してデバッガーを使おうとすると、nilが返されます。

(lldb) po myView
(MyView *) $552 = 0x00000000 <nil>

GCC 4.2に移行して、それが役立つかどうかを確認しますが、これはARCプロジェクトであるため、LLVMGCC4.2でコンパイルすることはできません。

もちろん、クエリする正しいアドレスがすでにわかっている場合は、LLDBが機能します。ただし、シンボル名とアドレスの間のリンクは、他のほとんどのオブジェクトでは機能しますが、一部のオブジェクトでは壊れているようです。

(lldb) po self
(MyViewController *const) $51 = 0x07e92200 <MyViewController: 0x7e92200>
(lldb) po myView
(MyView *) $25 = 0x00000000 <nil>
2012-04-20 15:44:17.250 myProject[37551:f803] myView: <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>
(lldb) po 0x7e8e240
(int) $50 = 132702784 <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>

どうすればこれを修正できますか?self-> myViewも試しましたが、どちらも機能しませんでした。

更新:(悪化します!)

この例では、myViewはプロパティではなくクラス変数であることを追加する必要があります(lldbはそれをnilに関連付けます)。myViewをクラスプロパティにして@synthesizeにすると、lldbは正しくないが予測可能な値を取得し、@synthesizeの前にmyViewシンボルを最後に合成されたプロパティに関連付けます。したがって、私の場合、コードは次のようになります。

@synthesize myDate=myDate_;
@synthesize myView;

したがって、LLDBからmyViewのプロパティを評価すると、myDate_に格納されている日付が表示されます。

(lldb) po myView
(MyView *) $24 = 0x07ca0900 2008-01-08 05:00:00 +0000

最後のケースでは、myViewをメソッド変数にすると、LLDBは正しくなります。

(lldb) po myView
(UIView *) $7 = 0x07d81080 <MyView: 0x7d81080; frame = (0 119; 768 885); layer = <CALayer: 0x7d81b70>>

これは、LLDB自体の非常に明白なバグのようなにおいがします。

アップデート2:

さらなる調査:すべてのクラスプロパティが間違っているようです!リストの最初のプロパティはLLDBのnilの値を示し、他のすべてのプロパティはその直前に合成されたプロパティの値を示します。

これは奇妙な設定エラーでしょうか?

4

3 に答える 3

8

ビルド構成がデバッグに設定されていることを確認してください。AdHoc、リリース、またはデバッグシンボルを削除したり、エンタイトルメントファイルでのデバッグを禁止したりするものではありません。

デバイスのアドホックビルドを作成した後、構成をデバッグに戻すのを忘れたため、これは私を苦しめました。不思議なことに、ほとんどのアプリは機能しましたが、特定のスタックフレームは、すべての変数(を含むself)がnilまたはmangledで、サイレントかつ不可解に失敗しました。

于 2012-05-31T04:06:17.643 に答える
0
frame variable -o myView

詳細については、「スタックフレーム状態の検査」の見出しの下を参照してください。

于 2012-04-20T20:20:54.780 に答える
0

解決策は次のように思われます。デバッガーを使用しようとするときは、シミュレーターでのテストを避けてください。デバイスでテストを開始すると、すべての狂気がなくなり、期待どおりに機能し始めました。シミュレーターに戻ると、同じバグが再び見られました。プロパティとメソッド変数の両方にシミュレーターの問題があるように見えました。

于 2012-04-23T12:23:00.387 に答える