web-dev-qa-db-ja.com

Objective-Cでシンボリックブレークポイントを使用してパラメーターを取得する方法

このようなブレークポイントがあります

_-[UITableViewCell setSelected:]
_

動作しますが、渡されている値を取得する方法がわかりません。

-[UITableViewCell setSelected:(BOOL)what]と_-[UITableViewCell setSelected:what]_を試しましたが、まったく機能しません。

パラメータにアクセスするにはどうすればよいですか?

これが機能しない場合は、何が起こっているかを確認するためにDebugUITableViewCellを作成する必要があります。これは面倒で、多くのコードに影響します。

32
Dan Rosenstark

デバイスでコードをデバッグする場合、ブレークポイントに到達したときのパラメーターは、常にレジスタr0、r1、およびr2にあります。 po $r0を使用すると、オブジェクトがsetSelectedを受信して​​いることがわかります。 po $r1を使用すると、セレクターであるため、「Objective-Cの説明はありません」というメッセージが表示されます。 $ r2を調べて、選択がYESまたはNOに設定されているかどうかを確認します。これはi386でも同様の話ですが、どのレジスタが使用されているかをすぐに思い出せません。

29
Aaron Golden

シミュレーターのLLDBで使用

p $arg3

最初のパラメータ。

13
Dan Rosenstark

デバッグの目的で、-[UITableViewCell setSelected:]を独自の実装に置き換えることができます。以下では、UIKitのメソッドの代わりにUITableViewCellSetSelectedが呼び出されます。

static void (*__originalUITableViewCellSetSelected)( UITableViewCell *, SEL, BOOL ) ;
static void UITableViewCellSetSelected( UITableViewCell * self, SEL _cmd, BOOL b )
{
    // your code here... (or set a breakpoint here)
    NSLog(@"%@<%p> b=%s\n", [ self class ], self, b ? "YES" : "NO" ) ;

    (*__originalUITableViewCellSetSelected)( self, _cmd, b ) ; // call original implementation:
}

@implementation UITableViewCell (DebugIt)

+(void)load
{
    Method m = class_getInstanceMethod( [ self class ], @selector( setSelected: ) ) ;
    __originalUITableViewCellSetSelected = (void(*)(id, SEL, BOOL))method_getImplementation( m ) ;
    method_setImplementation( m, (IMP)UITableViewCellSetSelected ) ;
}

@end
4
nielsbot

_-[UIApplication sendAction:toTarget:fromSender:forEvent:]_シンボルに基づいて、シンボリックブレークポイントを追加して、どの送信者がどのターゲットにアクションを送信したかを確認できます。

次のコマンドでシンボリックブレークポイントを作成します。

  • 記号:_-[UIApplication sendAction:toTarget:fromSender:forEvent:]_
  • デバッガのコマンドラインアクション:
    • _po "Target"_
    • _po $arg4_
    • _po "Sender"_
    • _po $arg5_

出力は次のようになります:"Target" <project.TargetViewController: 0x14ddb1470> "Sender" <UIButton: 0x14de86000; frame = (331 7; 49 30); opaque = NO; layer = <CALayer: 0x174237020>>

したがって、@ Danが言ったように、メソッドパラメータは引数3(_po $arg3_)で始まります。

1

ソースコードのないメソッドの場合、次のように機能します。デバッガーがメソッドの最初の行で停止するように、シンボリックブレークポイントを挿入します。一番上のスタックフレームが選択されていることを確認してください。次に:

Objectice-Cメソッドの場合

  • po $arg1は自分自身を印刷します
  • po $arg3は最初の引数を出力し、残りの引数は$arg4$arg5などに出力します。

C関数では、引数は$arg1で始まります

これは、IOSデバイスとシミュレーターの両方で機能します。

1