如何根据对象字符串属性在Xcode中设置条件断点?

时间:2009-06-12 19:34:31

标签: objective-c xcode debugging breakpoints

我希望能够在调试器达到特定的字符串匹配时使用。举个例子,我可能会有这样的事情:

Foo myObj = [self gimmeObj];

myObj可能有一个名为name的属性。我希望调试器在

时停止分配
[myObj.name isEqualToString:@"Bar"];

如何在Xcode中设置条件断点来做到这一点?

5 个答案:

答案 0 :(得分:175)

您可以通过正常设置断点在Xcode中设置条件断点,然后按住Control键并单击它并选择Edit Breakpoint(选择Run - > Show - > Breakpoints)。

在断点条目中,有一个Condition列。

现在,有几个问题要记住这个条件。首先,gdb不理解点语法,因此您必须使用[myObj name]而不是myObj.name(除非name是ivar)。

接下来,与gdb中的大多数表达式一样,您必须告诉它返回结果的类型,即“BOOL”。所以设置一个条件:

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

通常,通过临时添加以下代码来实现这一点通常更容易:

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

然后在NSLog上设置断点。那么你的情况可以是任意复杂的,而不必担心gdb可以解析什么,也不能解析。

答案 1 :(得分:11)

以下是使用XCode lldb条件断点的方法。

首先,双击断点(或右键单击edit breakpoint),可以看到弹出的对话框。

enter image description here

以下是这些选项的含义:

  1. 条件:断点只会在这种情况下触发。
  2. 忽略:在触发断点之前条件需要满足的次数
  3. 操作:在断点中断后运行的操作。
  4. 选项:评估操作后自动继续
  5. 以下是摘要。对于图像中的上述示例,这意味着当变量buildingId等于13时,请在此处中断。如果我将忽略时间添加到1,那么它将忽略buildingId等于13时的第一次,并在第二次满足条件时中断。

    对于操作,当您按添加操作时,将会有一个选择列表。通常我所做的就是使用Debugger Command po来打印我需要检查的变量,我相信有更好的方法可以使用我做的动作。

    如果在运行时更改条件,似乎必须重新编译并运行应用程序

答案 2 :(得分:7)

我不确定这是否可行,但您可以尝试在该行代码处设置断点,打开调试器控制台(Cmd + Shift + R),然后键入

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

其中N由断点号(整数)代替。

答案 3 :(得分:2)

如果使用setter改变myObj.name,则可以在调试器控制台或Xcode中的Run-> Manage Breakpoints-> Add Symbolic Breakpoint菜单中在-[MyObjClass setName:]添加符号断点。如果不是(为什么不呢?你可能不应该直接修改实例变量,除非在指定的初始化程序或dealloc中),你可以在gdb中设置一个观察点(一旦调试器运行就使用Xcode中的调试器控制台)。 This页面解释了如何操作。我不相信Xcode会在不使用调试器控制台的情况下公开用于设置观察点的UI。

答案 4 :(得分:0)

有时使用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