オブジェクト文字列プロパティに基づいてXcodeに条件付きブレークポイントを設定する方法は?


90

特定の文字列に一致したときにデバッガーを中断できるようにしています。例として、私はこのようなものを持つかもしれません:

Foo myObj = [self gimmeObj];

myObjというプロパティがある場合がありますname。デバッガーが割り当て時に停止するようにしたい

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

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

回答:


184

Xcodeで条件付きブレークポイントを設定するには、通常、ブレークポイントを設定し、コントロールクリックして[ブレークポイントの編集]を選択します([実行]-> [表示]-> [ブレークポイント]を選択)。

ブレークポイントエントリには、[条件]列があります。

さて、この状態について覚えておくべきいくつかの問題があります。まず、gdbはドット構文を理解しないため、myObj.nameの代わりに[myObj name]を使用する必要があります(名前がivarでない場合)。

次に、gdbのほとんどの式と同様に、返される結果のタイプ、つまり「BOOL」を通知する必要があります。したがって、次のような条件を設定します。

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

多くの場合、次のようなコードを一時的に追加することで、コードでこれを実行する方が実際には簡単です。

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

NSLogにブレークポイントを設定します。次に、gdbが解析できることと解析できないことを心配する必要なく、条件が任意に複雑になる可能性があります。


11
あなたのコードを変更することによって、あなたのログを削除し忘れたり、動作を変更する危険性を実行することを除いて
PAL Brattberg

3
それは本当だ。文字列に "NYI"(まだ実装されていません)を追加してこれを軽減することがよくあります。その後、リリース前のチェックでNYIを検索すると、それがキャッチされます。
Peter N Lewis、

17
これを機能させるには、(ブール)を(BOOL)として大文字にする必要がありました。おそらくLLDBのことです。
Wex

1
GDBではboolが機能しませんでした。BOOLまたはintを使用する必要がありました。違いはここで説明されていますstackoverflow.com/a/544250/725871
Chaosphere2112 2012年

2
200に1回の頻度でゲームバグが発生し、ついに条件付きブレークポイントを実行する必要がある場合は、コードにコードを組み込むことはできません。プログラムを停止してコードを変更することはできません。
Almo

17

XCode lldb条件付きブレークポイントを使用する方法を次に示します。

まず、ブレークポイントをダブルクリック(または右クリックedit breakpoint)すると、ダイアログポップアップが表示されます。

ここに画像の説明を入力してください

これらのオプションの意味は次のとおりです。

  1. 状態:ブレークポイントは、この状態でのみ発生します。
  2. 無視:ブレークポイントを起動する前に条件が満たされる必要がある回数
  3. アクション:ブレークポイントがブレークした後に実行されるアクション。
  4. オプション:アクションの評価後に自動的に続行します

ここに要約があります。上記の画像の例でbuildingIdは、変数が13の場合、ここで中断します。無視時間を1に追加するbuildingIdと、が13に等しいときに初めて無視され、条件が満たされたときに2回目にブレークします。

アクションの場合、アクションの追加を押すと、選択肢のリストが表示されます。通常、私が行うことは、Debugger Command poチェックする必要がある変数を出力するためにを使用することであり、アクションを使用するよりも良い方法があると思います。

実行時に条件を変更した場合、アプリを再コンパイルして実行する必要があるようです


おそらく、質問は文字列値に基づいてブレークポイントで停止することに関するものだった[ダウン投票ではなかった]
ZS

1
ありがとう、かなり役に立ちました。この答えはもっと投票に値する。
andreskwan

7

これが機能するかどうかはわかりませんが、コード行にブレークポイントを設定して、デバッガコンソールを開き(Cmd + Shift + R)、次のように入力してみてください。

condition N (int)[[myObj name] isEqualToString:@"Bar"]

ここで、Nはブレークポイントの番号(整数)に置き換えられます。


2

セッターを使用してmyObj.nameを変更する場合-[MyObjClass setName:]、デバッガーコンソールから、またはXcodeの[実行]-> [ブレークポイントの管理]-> [シンボリックブレークポイントの追加]メニューから、シンボリックブレークポイントを追加できます。そうでない場合(なぜでしょうか?指定されたイニシャライザまたはdeallocを除いて、インスタンス変数を直接変更すべきではないでしょう)gdbでウォッチポイントを設定できます(デバッガが実行されたら、Xcodeでデバッガコンソールを使用します)。このページでは、その方法について説明します。Xcodeがデバッガーコンソールを使用せずにウォッチポイントを設定するためのUIを公開するとは思いません。


0

フレームワーク(デバッグビルド)で作業していて、ナビゲートが困難な、または開発中のフレームワークで公開されていない特定のファイル/場所にブレークポイントを設定する必要がある場合。1つのオプションは、条件付きブレークポイントをトリガーしてステップイン/ステップアウトを容易にするヘルパークラスを作成することです。

- (void)invokeFrameworkMethod {
    ...
    [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."];
    ...
}

開発中のフレームワークでのヘッダー宣言。

#import <Foundation/Foundation.h>

@interface DebugConditionalBreakPointHelper : NSObject
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment;
@end

そして実装ファイル:

#import "DebugConditionalBreakPointHelper.h"

@implementation DebugConditionalBreakPointHelper
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment {
    if (enabled)
    {
        NSLog(@"Triggerred Conditional Break Point. Comment: %@");
    }
}
@end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.