Вы можете установить условную точку останова в Xcode, установив точку останова в обычном режиме, затем щелкните ее, удерживая клавишу Control, и выберите «Изменить точку останова» (выберите «Выполнить» -> «Показать» -> «Точки останова»).
В записи точки останова есть столбец Условие.
Теперь есть несколько моментов, которые следует учитывать при этом условии. Во-первых, gdb не понимает синтаксис с точкой, поэтому вместо myObj.name вы должны использовать [myObj name] (если имя не является ivar).
Затем, как и в большинстве выражений в gdb, вы должны указать ему тип возвращаемого результата, а именно «BOOL». Итак, установите такое условие:
(BOOL)[[myObj name] isEqualToString:@"Bar"]
Часто на самом деле проще сделать это в коде, временно добавив такой код, как:
if ( [myObj.name isEqualToString:@"Bar"] ) {
NSLog( @"here" );
}
а затем установите точку останова в NSLog. Тогда ваше условие может быть произвольно сложным, не беспокоясь о том, что GDB может и что не может анализировать.
Вот как вы используете условные точки останова XCode lldb.
Сначала дважды щелкните точку останова (или щелкните правой кнопкой мыши
edit breakpoint
), вы увидите всплывающее диалоговое окно.Вот что означает этот вариант:
Вот резюме. Для приведенного выше примера на изображении это означает, что, когда переменная
buildingId
равна 13, остановитесь здесь. Если я добавлю время игнорирования к 1, тогда он будет игнорировать первый раз, когдаbuildingId
оно равно 13, и прервется во второй раз, когда условие выполнено.Для действий, когда вы нажимаете добавить действия, появится список выбора. Обычно я использую
Debugger Command
po
для печати переменных, которые мне нужно проверить, и я считаю, что есть более эффективные способы использования действий, чем я.Похоже, вам придется перекомпилировать и запустить приложение, если вы измените условия во время выполнения
источник
Я не уверен, что это сработает, но вы можете попробовать установить точку останова в этой строке кода, открыть консоль отладчика (Cmd + Shift + R) и ввести
condition N (int)[[myObj name] isEqualToString:@"Bar"]
Где N заменяется номером точки останова (целым числом).
источник
Если вы изменяете myObj.name с помощью установщика, вы можете добавить символическую точку останова
-[MyObjClass setName:]
либо из консоли отладчика, либо из меню «Выполнить» -> «Управление точками останова» - > «Добавить символическую точку останова» в 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
источник