Как установить условную точку останова в Xcode на основе строкового объекта недвижимости?
Я ищу, чтобы иметь возможность иметь отладчик перерыв, когда он достигает определенного соответствия строки. В качестве примера, я мог бы что-то вроде этого:
Foo myObj = [self gimmeObj];
myObj может иметь свойство с именем name. Я хочу, чтобы отладчик остановился на задании, когда
[myObj.name isEqualToString:@"Bar"];
как я могу установить свою условную точку останова в Xcode, чтобы сделать это?
5 ответов:
вы можете установить условную точку останова в Xcode, установив точку останова нормально, затем нажмите на нее и выберите Редактировать точку останова (выберите Run- > Show - > Breakpoints).
В точки останова, есть столбец условие.
Так вот, есть несколько вопросов, чтобы иметь в виду условия. Во-первых, gdb не понимает синтаксис точек, поэтому вместо myObj.name, вы должны использовать [myObj name] (если имя не является ivar).
далее, как и в большинстве выражения в gdb, вы должны сказать ему тип возвращаемого результата, а именно "BOOL". Поэтому установите условие типа:
(BOOL)[[myObj name] isEqualToString:@"Bar"]часто на самом деле проще просто сделать это в коде, временно добавив код, например:
if ( [myObj.name isEqualToString:@"Bar"] ) { NSLog( @"here" ); }и затем установка точки останова на NSLog. Тогда ваше состояние может быть сколь угодно сложным, не беспокоясь о том, что gdb может и не может разобрать.
Я не уверен, что это сработает, но вы можете попробовать установить точку останова в этой строке кода, открыть консоль отладчика (Cmd + Shift+R) и ввести
condition N (int)[[myObj name] isEqualToString:@"Bar"]где N заменяется номером точки останова (целое число).
вот как вы используете условные точки останова Xcode lldb.
во-первых, дважды щелкните точку останова (или щелкните правой кнопкой мыши
edit breakpoint), вы можете увидеть всплывающее окно.вот что это означает:
- условие: точка останова будет срабатывать только при этом условии.
- игнорировать: количество времен условие нужно встретить перед огнем точка останова
- действие: действие, которое выполняется после разрыва точки останова.
- опции: автоматически продолжить после оценки действий
вот резюме. Для приведенного выше примера в изображении это означает, что когда переменная
buildingIdравно 13, перерыв здесь. Если я добавлю игнорировать время 1, то он будет игнорировать в первый раз, когдаbuildingIdравно 13 и прерывается при повторном выполнении условия.для действий, когда вы нажимаете Добавить действия, появится список выбора. Обычно то, что я делаю, это использовать
Debugger Commandpoдля печати переменных, которые мне нужно проверить, и я считаю, что есть лучшие способы использования действий, то я делаю.кажется, что вы должны перекомпилировать и запустить приложение, если вы менять условия во время выполнения
Если вы мутируете myObj.name используя сеттер, вы можете добавить символическую точку останова на
-[MyObjClass setName:]либо из консоли отладчика, либо из меню Run->Manage Breakpoints->Add Symbolic Breakpoint в Xcode. Если нет (то почему? вероятно, вы не должны изменять переменную экземпляра напрямую, за исключением назначенного инициализатора или dealloc) вы можете установить точку наблюдения в gdb (используйте консоль отладчика в Xcode после запуска отладчика). этой страница объясняет, как. Я не верю Xcode предоставляет пользовательский интерфейс для установки точек наблюдения без использования консоли отладчика.
иногда при работе с фреймворками (отладочные сборки) и нужно поместить точку останова в определенный файл/местоположение, которое трудно ориентироваться или не открыто публично в разрабатываемой среде. Один из вариантов-написать вспомогательный класс для запуска условных точек останова и сделать шаг в/шаг из проще.
- (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

Comments