特定の文字列の一致に達したときにデバッガーをブレークできるようにしたいと考えています。例として、次のようなものがあります。
Foo myObj = [self gimmeObj];
myObj
には、name
というプロパティがあります。割り当て時にデバッガーを停止させたい場合
[myObj.name isEqualToString:@"Bar"];
Xcodeで条件付きブレークポイントを設定するにはどうすればよいですか?
Xcodeで条件付きブレークポイントを設定するには、通常ブレークポイントを設定し、Ctrlキーを押しながらクリックして[ブレークポイントの編集]を選択します([実行]-> [表示]-> [ブレークポイント]を選択)。
ブレークポイントエントリには、[条件]列があります。
現在、この状態について留意すべきいくつかの問題があります。まず、gdbはドット構文を理解しないため、myObj.nameの代わりに[myObj name]を使用する必要があります(名前がivarでない場合)。
次に、gdbのほとんどの式と同様に、返される結果のタイプ、つまり「BOOL」を指定する必要があります。そのため、次のような条件を設定します。
(BOOL)[[myObj name] isEqualToString:@"Bar"]
多くの場合、一時的に次のようなコードを追加することで、実際にコードでこれを行う方が簡単です。
if ( [myObj.name isEqualToString:@"Bar"] ) {
NSLog( @"here" );
}
nSLogにブレークポイントを設定します。そうすれば、gdbで解析できるものとできないものを心配することなく、条件を任意に複雑にすることができます。
XCode lldb条件付きブレークポイントを使用する方法を次に示します。
最初に、ブレークポイントをダブルクリックします(または右クリックedit breakpoint
)、ダイアログのポップアップが表示されます。
これらのオプションの意味は次のとおりです。
以下に要約を示します。上記の画像の例では、変数buildingId
が13に等しい場合、ここで中断します。無視時間を1に追加すると、buildingId
が13に等しい場合は1回目を無視し、条件が2回目に満たされると中断します。
アクションの場合、アクションの追加を押すと、選択リストが表示されます。通常、私はDebugger Command
po
は、チェックする必要がある変数を出力します。アクションを使用するよりも良い方法があると思います。
実行時に条件を変更した場合、アプリを再コンパイルして実行する必要があるようです
これが機能するかどうかはわかりませんが、そのコード行にブレークポイントを設定して、デバッガーコンソールを開き(Cmd + Shift + R)、入力することができます
condition N (int)[[myObj name] isEqualToString:@"Bar"]
Nはブレークポイントの番号(整数)に置き換えられます。
セッターを使用してmyObj.nameを変更する場合は、デバッガーコンソールまたはXcodeの[実行]-> [ブレークポイントの管理]-> [シンボルブレークポイントの追加]のいずれかから-[MyObjClass setName:]
にシンボルブレークポイントを追加できます。そうでない場合(指定されたイニシャライザまたはdeallocを除き、インスタンス変数を直接変更する必要はないでしょう)、gdbでウォッチポイントを設定できます(デバッガが実行されたら、Xcodeでデバッガコンソールを使用します)。 これ ページで方法を説明します。 Xcodeは、デバッガコンソールを使用せずにウォッチポイントを設定するためのUIを公開するとは思わない。
フレームワーク(デバッグビルド)を使用しているときに、特定のファイル/場所にブレークポイントを配置する必要がある場合。 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