如何基于对象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。
以下是这些选项的含义:
- 条件 :断点只会在这种情况下触发。
- 忽略 :在触发断点之前条件需要满足的次数
- 操作 :在断点之后运行的操作。
- 选项 :评估操作后自动继续
这是一个总结。 对于上图中的例子,这意味着当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