特定の文字列に一致したときにデバッガーを中断できるようにしています。例として、私はこのようなものを持つかもしれません:
Foo myObj = [self gimmeObj];
myObj
というプロパティがある場合がありますname
。デバッガーが割り当て時に停止するようにしたい
[myObj.name isEqualToString:@"Bar"];
Xcodeで条件付きブレークポイントを設定するにはどうすればよいですか?
特定の文字列に一致したときにデバッガーを中断できるようにしています。例として、私はこのようなものを持つかもしれません:
Foo myObj = [self gimmeObj];
myObj
というプロパティがある場合がありますname
。デバッガーが割り当て時に停止するようにしたい
[myObj.name isEqualToString:@"Bar"];
Xcodeで条件付きブレークポイントを設定するにはどうすればよいですか?
回答:
Xcodeで条件付きブレークポイントを設定するには、通常、ブレークポイントを設定し、コントロールクリックして[ブレークポイントの編集]を選択します([実行]-> [表示]-> [ブレークポイント]を選択)。
ブレークポイントエントリには、[条件]列があります。
さて、この状態について覚えておくべきいくつかの問題があります。まず、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に等しいときに初めて無視され、条件が満たされたときに2回目にブレークします。
アクションの場合、アクションの追加を押すと、選択肢のリストが表示されます。通常、私が行うことは、Debugger Command
po
チェックする必要がある変数を出力するためにを使用することであり、アクションを使用するよりも良い方法があると思います。
実行時に条件を変更した場合、アプリを再コンパイルして実行する必要があるようです
これが機能するかどうかはわかりませんが、コード行にブレークポイントを設定して、デバッガコンソールを開き(Cmd + Shift + R)、次のように入力してみてください。
condition N (int)[[myObj name] isEqualToString:@"Bar"]
ここで、Nはブレークポイントの番号(整数)に置き換えられます。
セッターを使用してmyObj.nameを変更する場合-[MyObjClass setName:]
、デバッガーコンソールから、またはXcodeの[実行]-> [ブレークポイントの管理]-> [シンボリックブレークポイントの追加]メニューから、シンボリックブレークポイントを追加できます。そうでない場合(なぜでしょうか?指定されたイニシャライザまたは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