Как установить условную точку останова в Xcode на основе свойства объекта?
Я ищу, чтобы иметь возможность отлаживать отладчик, когда он достигает определенного совпадения строк. В качестве примера у меня может быть что-то вроде этого:
Foo myObj = [self gimmeObj];
myObj
может иметь свойство, называемое name
. Я хочу, чтобы отладчик остановился на задании, когда
[myObj.name isEqualToString:@"Bar"];
Как я могу установить свою условную точку останова в Xcode для этого?
- Каков самый быстрый способ найти «визуальный» центр многоугольника неправильной формы?
- Почему мои контрольные точки не работают?
Вы можете установить условную точку прерывания в Xcode, установив контрольную точку в обычном режиме, затем щелкнив ее правой кнопкой мыши и выберите «Редактировать точку останова» (выберите «Выполнить» -> «Показать -> точки останова»).
В записи точки останова есть столбец «Условие».
Теперь есть несколько вопросов, которые следует учитывать при условии. Во-первых, 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 Command
po
для печати переменных, которые мне нужно проверить, и я считаю, что есть лучшие способы использования действий, которые я делаю.
Кажется, что вам нужно перекомпилировать и запустить приложение, если вы измените условия во время выполнения
Если вы изменяете myObj.name с помощью setter, вы можете добавить символическую -[MyObjClass setName:]
останова на -[MyObjClass setName:]
либо из консоли Debugger, либо из меню Run-> Manage Breakpoints-> Add Symbolic Breakpoint в Xcode. Если нет (почему бы и нет? Вы, вероятно, не должны изменять переменную экземпляра напрямую, кроме назначенного инициализатора или dealloc), вы можете установить точку наблюдения в gdb (используйте консоль отладчика в Xcode после запуска отладчика). На этой странице объясняется, как. Я не считаю, что Xcode предоставляет пользовательский интерфейс для установки точек наблюдения без использования консоли отладчика.
В то время, когда вы работаете с Frameworks (отладочные сборки) и вам нужно поставить точку останова в определенном файле / местоположении, которую трудно ориентировать или не публиковать в рамках разработки. Один из вариантов заключается в том, чтобы написать вспомогательный class для запуска условных точек останова и упростить шаг за шагом.
- (void)invokeFrameworkMethod { ... [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."]; ... }
Декларация заголовка в рамках разработки.
#import @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