如何基于对象string属性在Xcode中设置条件断点?

我期待能够让debugging器在达到特定string匹配时中断。 作为一个例子,我可能有这样的事情:

Foo myObj = [self gimmeObj]; 

myObj可能有一个名为name的属性。 我希望debugging器在分配时停止

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

我怎样才能在Xcode中设置我的条件断点来做到这一点?

您可以通过设置断点来设置Xcode中的条件断点,然后通过按住Control键并点击Edit Breakpoint(selectRun – > Show – > Breakpoints)。

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

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

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

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

通常情况下,通过临时添加如下代码,可以在代码中执行此操作:

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

然后在NSLog上设置断点。 那么你的条件可以任意复杂,而不必担心gdb可以和不能分析什么。

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

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

其中N由断点的数字(一个整数)代替。

如果使用setter来更改myObj.name,则可以在Xcode的Debugger Console或Run-> Manage Breakpoints-> Add Symbolic Breakpoint菜单中的-[MyObjClass setName:]添加符号断点。 如果没有(为什么不呢?你可能不应该直接修改实例variables(除了在指定的初始化程序或dealloc中),你可以在gdb中设置一个监视点(一旦debugging器运行,在Xcode中使用debugging器控制台)。 这个页面解释了如何。 我不相信Xcode暴露了一个用户界面设置观察点,而不使用debugging器控制台。

这里是你如何使用XCode lldb条件断点。

首先,双击断点(或者右击edit breakpoint ),你可以看到一个对话框popup。

在这里输入图像说明

以下是这些选项的含义:

  1. 条件 :断点只会在这种情况下触发。
  2. 忽略 :在触发断点之前条件需要满足的次数
  3. 操作 :在断点之后运行的操作。
  4. 选项 :评估操作后自动继续

这是一个总结。 对于上图中的例子,这意味着当variablesbuildingId等于13时,在这里打破。 如果将忽略时间添加到1,那么当buildingId等于13时,它将忽略第一次,并在第二次满足条件时中断。

对于操作,当您按添加操作时,会有一个select列表。 通常我所做的是使用Debugger Command po来打印我需要检查的variables,并且我相信有更好的方法来使用这个动作。

看来,如果您在运行时更改条件,则必须重新编译并运行应用程序

在使用框架(debugging版本)的时候,需要在某个难以导航的文件/位置放置断点,或者在开发框架中公开地公开暴露断点。 一种select是编写一个帮助类来触发条件断点,并使进入/退出变得更容易。

 - (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