Почему действительно утверждает просто оконечный программа, скомпилированная для iPhone?

Я отлаживаю, в большой степени утверждают () 'приложение для iPhone редактора (XCode, Objective C ++, и средство моделирования устройства). В некоторых случаях утверждать отказ только завершил бы приложение, вместо того, чтобы ворваться в отладчик, как я буду ожидать.

Я сделал обходное решение путем реализации моего собственного своего рода - утверждают к эффекту:

#define AssertLite(b) if(!(b)) {asm {int 3}}

(опущенный пух), но интересно, встречался ли кто-либо когда-нибудь с этим. Я не мог определить шаблон относительно того, когда делает он повреждается и когда делает он завершается. Код не является поточным; все, что это делает, сделано в обработчиках событий.

Почему это происходит и как я заставляю ваниль утверждать (), ведут себя как условная точка останова, которой это должно быть?

8
задан Peter Mortensen 10 December 2017 в 16:40
поделиться

1 ответ

Во-первых, так как вы работаете с приложением для iPhone, вам, вероятно, следует использовать NSAssert() вместо ванильной функции утверждения BSD.

например. NSAssert(the_object, @"NIL object encountered");

Макрос NSAssert бросит исключение Objective-C (NSInternalInconsistencyException), если утверждение не удастся.

Так как ваша цель - прервать исключение, то следующим шагом будет прервать отладчик Xcode на исключениях Objective-C. В любом случае, это, вероятно, хорошо.

В окне Точки останова (Run->Show->Breakpoints menu item), щелкните там, где написано "Double-Click for Symbol", чтобы ввести символ -[NSException raise]

Последнее, что нужно сделать, это чтобы NSAsserts компилировал а не в релизной сборке. Это означает, что либо вы должны быть готовы к работе с исключением в вашем приложении, либо вы должны создать свой собственный макрос, который компилируется в релизной сборке.

Вот макрос, который я использую для компиляции утверждений в runtime-коде (обратите внимание, что затем я использую HMAssert в своем коде вместо NSAssert):

#ifdef DEBUG
#   define HMAssert(A,B) NSAssert(A,B)
#else
#   define HMAssert(A,B)
#endif

Это требует определения DEBUG макроса препроцессора. Вот как это настроить:

  1. Щелкните правой кнопкой мыши на вашем проекте в Xcode. Это будет верхний пункт в левой панели, где перечислены файлы ваших проектов
  2. Выберите "Get Info" из появившегося контекстного меню.
  3. Перейдите на вкладку "Build".
  4. Убедитесь, что для "Configuration" установлено значение "Debug".
  5. Введите DEBUG в поле рядом с "Preprocessor Macros" в разделе "GCC 4.2 - Preprocessing".
15
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: