Подтвердить что ты не робот

Как установить условную точку останова в Xcode на основе свойства объекта?

Я ищу, чтобы иметь возможность отлаживать отладчик, когда он достигает определенного совпадения строк. В качестве примера у меня может быть что-то вроде этого:

Foo myObj = [self gimmeObj];

myObj может иметь свойство, называемое name. Я хочу, чтобы отладчик остановился на назначении, когда

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

Как я могу установить свою условную точку останова в Xcode для этого?

4b9b3361

Ответ 1

Вы можете установить условную точку прерывания в Xcode, установив контрольную точку в обычном режиме, затем щелкнув по ней правой кнопкой мыши и выберите "Редактировать точку останова" (выберите "Выполнить" → "Показать → точки останова" ).

В записи точки останова есть столбец Условие.

Теперь есть несколько вопросов, которые следует учитывать при условии. Во-первых, gdb не понимает точечный синтаксис, поэтому вместо myObj.name вы должны использовать [myObj name] (если имя не является ivar).

Далее, как и большинство выражений в gdb, вы должны указать тип результата возврата, а именно "BOOL". Поэтому установите условие, подобное:

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

Часто на самом деле проще просто сделать это в коде, временно добавив код, например:

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

а затем установите точку останова в NSLog. Тогда ваше условие может быть сколь угодно сложным, не беспокоясь о том, что gdb может и не может проанализировать.

Ответ 2

Я не уверен, что это сработает, но вы можете попробовать установить точку останова в этой строке кода, открыть консоль отладчика (Cmd + Shift + R) и набрать

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

Где N заменяется номером точки останова (целое число).

Ответ 3

Если вы изменяете myObj.name с помощью setter, вы можете добавить символическую точку останова на -[MyObjClass setName:] либо из консоли Debugger, либо из меню Run- > Manage Breakpoints- > Add Symbolic Breakpoint в Xcode. Если нет (почему бы и нет? Вы, вероятно, не должны изменять переменную экземпляра напрямую, кроме назначенного инициализатора или dealloc), вы можете установить точку наблюдения в gdb (используйте консоль отладчика в Xcode после запуска отладчика). Эта страница объясняет, как это сделать. Я не считаю, что Xcode предоставляет пользовательский интерфейс для установки точек наблюдения без использования консоли отладчика.

Ответ 4

Вот как вы это используете, используя условные точки останова XCode lldb.

Сначала дважды щелкните точку разрыва (или щелкните правой кнопкой мыши edit breakpoint), вы увидите всплывающее окно диалога.

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

Вот что означает этот параметр:

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

Вот резюме. Для приведенного выше примера на изображении это означает, что когда переменная buildingId равна 13, перерыв здесь. Если я добавлю время игнорирования в 1, то он проигнорирует первый раз, когда buildingId будет равным 13, а во второй раз будет выполнено условие.

Для действий, когда вы нажимаете дополнительные действия, будет выбран список. Обычно я использую Debugger Command po для печати переменных, которые мне нужно проверить, и я считаю, что есть лучшие способы использования действий, которые я делаю.

Кажется, вам нужно перекомпилировать и запустить приложение, если вы измените условия во время выполнения

Ответ 5

В то время, когда вы работаете с Frameworks (отладочные сборки) и вам нужно поставить точку останова в определенном файле/местоположении, которую трудно ориентировать или не публиковать в рамках разработки. Один из вариантов заключается в том, чтобы написать вспомогательный класс для запуска условных точек останова и упрощения ввода/вывода.

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