Как установить условную точку останова в Xcode на основе свойства объекта?
Я ищу, чтобы иметь возможность отлаживать отладчик, когда он достигает определенного совпадения строк. В качестве примера у меня может быть что-то вроде этого:
Foo myObj = [self gimmeObj];
myObj
может иметь свойство, называемое name
. Я хочу, чтобы отладчик остановился на назначении, когда
[myObj.name isEqualToString:@"Bar"];
Как я могу установить свою условную точку останова в Xcode для этого?
Ответы
Ответ 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