Как установить условную точку останова в Xcode на основе строкового объекта недвижимости?



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



Foo myObj = [self gimmeObj];


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



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


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

661   5  

5 ответов:

вы можете установить условную точку останова в Xcode, установив точку останова нормально, затем нажмите на нее и выберите Редактировать точку останова (выберите Run- > Show - > Breakpoints).

В точки останова, есть столбец условие.

Так вот, есть несколько вопросов, чтобы иметь в виду условия. Во-первых, 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), вы можете увидеть всплывающее окно.

enter image description here

вот что это означает:

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

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

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

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

Если вы мутируете myObj.name используя сеттер, вы можете добавить символическую точку останова на -[MyObjClass setName:] либо из консоли отладчика, либо из меню Run->Manage Breakpoints->Add Symbolic Breakpoint в 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

Comments

    Ничего не найдено.