Как установить условную точку останова в 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 ), вы увидите всплывающее окно диалога.

    введите описание изображения здесь

    Вот что означает этот вариант:

    1. Условие : точка останова будет срабатывать только при этом условии.
    2. Игнорировать : количество раз, когда необходимо выполнить условие перед тем, как запустить точку останова
    3. Действие : Действие, которое выполняется после разрыва точки останова.
    4. Параметры : автоматически продолжить после оценки действий

    Вот резюме. Для приведенного выше примера на изображении это означает, что когда переменная 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 
    Interesting Posts

    Почему этот общий метод с привязкой возвращает какой-либо тип?

    Симулятор IOS 8 не может загружаться

    Как resize AVD-эмулятора в Android Studio?

    Изменение поведения отступа Vim по типу файла

    Чем отличается Ctrl + Z и Ctrl + C в командной строке Unix?

    Совместное использование файлов Windows 10 на локальном wifi ужасно медленно

    Как преобразовать hex в rgb с помощью Java?

    Вставить многострочную строку Java в Eclipse

    Как определить количество цифр целого числа в C?

    Android Device Monitor не открывается – ошибка в файле журнала

    Как можно установить операционную систему при отсутствии средств установки?

    Как удалить подчеркивание полей внешнего ключа в коде сначала по соглашению

    Взлом для запуска нескольких iMacros случайным образом

    Мышь случайно замерзает около 20 секунд в Ubuntu 10.10, пожалуйста, помогите устранить неисправность

    Могу ли я использовать машину времени с сетевым диском?

    Давайте будем гением компьютера.