Как установить условную точку останова в Xcode на основе свойства строки объекта? - PullRequest
85 голосов
/ 12 июня 2009

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

Foo myObj = [self gimmeObj];

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

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

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

Ответы [ 5 ]

176 голосов
/ 13 июня 2009

Вы можете установить условную точку останова в XCode, установив точку останова обычным образом, затем нажмите на нее, удерживая клавишу Control, и выберите «Изменить точку останова» (выберите «Выполнить» -> «Показать» -> «Точки останова»).

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

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

Далее, как и в большинстве выражений в gdb, вы должны указать тип возвращаемого результата, а именно «BOOL». Итак, установите условие как:

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

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

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

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

11 голосов
/ 16 февраля 2017

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

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

enter image description here

Вот что означает эта опция:

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

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

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

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

7 голосов
/ 12 июня 2009

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

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

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

2 голосов
/ 12 июня 2009

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

0 голосов
/ 08 февраля 2017

Временами при работе с 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
...