我希望能够在达到特定字符串匹配时使调试器中断。例如,我可能会有这样的事情:
Foo myObj = [self gimmeObj];
myObj
可能有一个名为的属性name
。我希望调试器在以下情况下停止分配
[myObj.name isEqualToString:@"Bar"];
如何在Xcode中设置条件断点来做到这一点?
Answers:
您可以通过正常设置断点来在Xcode中设置条件断点,然后按住Control键单击并选择“编辑断点”(选择“运行”->“显示”->“断点”)。
在断点条目中,有一个Condition列。
现在,需要牢记几个问题。首先,gdb无法理解点语法,因此必须使用[myObj name](除非name是ivar)代替myObj.name。
接下来,与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 时它将第一次忽略,并在第二次满足条件时中断。
对于操作,当您按添加操作时,将有一个选择列表。通常,我要做的是使用Debugger Command
po
打印需要检查的变量,并且我相信使用动作比使用我有更好的方法。
如果您在运行时更改条件,似乎必须重新编译并运行应用程序
有时,在使用Frameworks(调试版本)时,需要在某些文件/位置设置一个断点,该断点难以导航或在开发中的框架中未公开公开。一种选择是编写一个帮助程序类以触发条件断点并使进入/退出更加容易。
- (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