1. ホーム
  2. objective-c

[解決済み] オブジェクトの文字列プロパティに基づいて、Xcodeで条件付きブレークポイントを設定するにはどうすればよいですか?

2023-02-11 07:33:54

質問

特定の文字列にマッチしたときにデバッガーをブレークさせることができるようにしたいと思っています。例として、私は次のようなものを持っているかもしれません。

Foo myObj = [self gimmeObj];

myObj というプロパティがあるかもしれません。 name . 私はデバッガが以下の場合に代入を停止するようにしたい

[myObj.name isEqualToString:@"Bar"];

Xcodeで条件付きブレークポイントを設定するにはどうすればよいですか?

どのように解決するのですか?

Xcodeで普通にブレークポイントを設定し、その上でcontrolキーを押しながらクリックし、Edit Breakpoint(実行 -> 表示 -> ブレークポイントを選択)を選択すると、条件付きブレークポイントを設定することができます。

ブレークポイントエントリに、Condition欄があります。

さて、この条件にはいくつか注意しなければならない点があります。 まず、gdb はドット構文を理解しないので、myObj.name の代わりに [myObj name] を使用しなければなりません (name が ivar でない限り)。

次に、gdbのほとんどの式と同様に、戻り値の型、つまり"BOOL"を伝えなければなりません。 そこで、次のような条件を設定します。

(BOOL)[[myObj name] isEqualToString:@"Bar"]

のようなコードを一時的に追加して、コードでこれを行う方が実際には簡単であることがよくあります。

if ( [myObj.name isEqualToString:@"Bar"] ) {
    NSLog( @"here" );
}

といった具合に、NSLog上でブレークポイントを設定します。 そうすれば、gdbが何を解析できて、何を解析できないかを気にすることなく、任意に複雑な条件を設定することができます。