web-dev-qa-db-ja.com

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

特定の文字列の一致に達したときにデバッガーをブレークできるようにしたいと考えています。例として、次のようなものがあります。

Foo myObj = [self gimmeObj];

myObjには、nameというプロパティがあります。割り当て時にデバッガーを停止させたい場合

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

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

86
Coocoo4Cocoa

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

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

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

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

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

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

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

nSLogにブレークポイントを設定します。そうすれば、gdbで解析できるものとできないものを心配することなく、条件を任意に複雑にすることができます。

177
Peter N Lewis

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

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

enter image description here

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

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

以下に要約を示します。上記の画像の例では、変数buildingIdが13に等しい場合、ここで中断します。無視時間を1に追加すると、buildingIdが13に等しい場合は1回目を無視し、条件が2回目に満たされると中断します。

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

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

12
nuynait

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

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

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

7
Adam Rosenfield

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

2
Barry Wark

フレームワーク(デバッグビルド)を使用しているときに、特定のファイル/場所にブレークポイントを配置する必要がある場合。 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
0
lal