Як встановити умовну точку зупинки в Xcode на основі властивості рядка об’єкта?


90

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

Foo myObj = [self gimmeObj];

myObjможе мати властивість під назвою name. Я хочу, щоб налагоджувач зупинився на призначенні, коли

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

Як я можу встановити для цього свою умовну точку зупинки в Xcode?

Відповіді:


184

Ви можете встановити умовну точку зупинки в Xcode, встановивши нормально точку зупинки, потім клацніть на ній клавішу Control та виберіть Редагувати точку зупинки (виберіть Виконати -> Показати -> Точки зупинки).

У записі точки зупинку є стовпець Умова.

Зараз є кілька питань, які слід пам’ятати про стан. По-перше, gdb не розуміє синтаксис крапок, тому замість myObj.name ви повинні використовувати [myObj name] (якщо ім'я не є ivar).

Далі, як і у більшості виразів у gdb, ви повинні вказати йому тип результату повернення, а саме "BOOL". Тож поставте таку умову, як:

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

Часто насправді простіше просто зробити це в коді, тимчасово додавши такий код:

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

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


11
За винятком того, що, змінюючи свій код, ви ризикуєте забути видалити свою реєстрацію або змінити поведінку
Pål Brattberg

3
Це правда. Я часто пом'якшую це, додаючи до рядка "NYI" (ще не реалізований), і тоді мій пошук перед випуском для перевірки NYI вловить його.
Peter N Lewis

17
Щоб це працювало, мені довелося зробити (bool) велику літеру як (BOOL), ймовірно, річ LLDB.
Wex

1
bool у мене не працював у GDB, мені довелося використовувати BOOL або int - різниця пояснюється тут stackoverflow.com/a/544250/725871 .
Chaosphere2112

2
Ви не можете помістити його в код, якщо у вас є раз на кожні 200 ігрових помилок, які нарешті з’явилися, і тепер вам потрібно зробити умовну точку зупинки. Зупинити програму для зміни коду не можна.
Альмо,

17

Ось як ви робите використання умовних точок зупинення XCode lldb.

По-перше, двічі клацніть точку розриву (або клацніть правою кнопкою миші edit breakpoint), ви побачите спливаюче діалогове вікно.

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

Ось, що означає цей варіант:

  1. Умова : Точка зупинки спрацює лише за цієї умови.
  2. Ігнорувати : кількість випадків, коли умова повинна відповідати перед вибухом точки зупинку
  3. Дія : дія, яка виконується після розриву точки зупинки.
  4. Параметри : Автоматично продовжувати після оцінки дій

Ось короткий зміст. Для наведеного вище прикладу в зображенні це означає, що коли змінна buildingIdдорівнює 13, розбивайте тут. Якщо я додаю час ігнорування до 1, тоді він буде ігнорувати перший раз, коли buildingIdдорівнює 13, і зламається при другому виконанні умови.

Для дій, коли ви натискаєте додати дії, буде список вибору. Зазвичай те, що я роблю, це використовувати Debugger Command poдля друку змінних, які мені потрібно перевірити, і я вважаю, що є кращі способи використання дій, ніж я.

Здається, вам доведеться перекомпілювати та запустити програму, якщо ви зміните умови під час виконання


Можливо тому, що питання стосувалося зупинки в точці зупинки на основі значення рядка [я не був виборцем]
ZS

1
Дякую, дуже корисно. Ця відповідь заслуговує на більшу кількість голосів.
andreskwan

7

Я не впевнений, що це буде працювати, але ви можете спробувати встановити точку зупинки в цьому рядку коду, відкрити консоль відладчика (Cmd + Shift + R) і ввести

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

Де N замінюється номером точки зупинку (цілим числом).


2

Якщо ви мутуєте myObj.name за допомогою установщика, ви можете додати символічну точку зупинки -[MyObjClass setName:]або з консолі налагоджувача, або з меню Виконати-> Керувати точками зупинки- > Додати символьну точку зупинки в Xcode. Якщо ні (чому ні? Ви, мабуть, не повинні змінювати змінну екземпляра безпосередньо, за винятком призначеного ініціалізатора або dealloc), ви можете встановити точку спостереження в gdb (використовуйте консоль відладчика в Xcode після запуску налагоджувача). Ця сторінка пояснює, як. Я не вірю, що Xcode виставляє інтерфейс для встановлення точок спостереження без використання консолі налагоджувача.


0

Іноді під час роботи з 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.