Лучшие практики для Регистрации ошибок и/или сообщающий для iPhone

С точки зрения типа сдвига Вы добираетесь, важной вещью является тип значения, которое Вы смещаете. Классический источник ошибок - при смещении литерала к, скажем, нулевым разрядам маски. Например, если бы Вы хотели отбросить крайний левый бит целого числа без знака, тогда Вы могли бы попробовать это как свою маску:

~0 >> 1

, К сожалению, это получит Вас в проблему, потому что маска будет иметь весь свой набор битов, потому что значение, смещаемое (~0), подписывается, таким образом арифметический сдвиг выполняется. Вместо этого Вы хотели бы вызвать логический сдвиг путем явного объявления значения как неподписанного, т.е. путем выполнения чего-то вроде этого:

~0U >> 1;
29
задан Cœur 21 October 2018 в 06:57
поделиться

3 ответа

Вот что мы делаем:

  • Пусть iPhone обрабатывает собственные аварийные дампы через существующие механизмы App Store . Обновление : обнаружив, что iTunes Connect ненадежен при предоставлении отчетов о сбоях, я рекомендую использовать Fabric / Crashlytics или конкурента, например Crittercism или Rollbar .
  • В нашем выпущенном продукте нет никаких следов, это похоже на то, что делают большинство других приложений для iPhone.
  • Если сообщается об ошибке, мы воспроизводим ее с помощью трассируемой сборки.

Более подробно:

  • Мы определяем макросы для трассировки NSLog на множестве различных уровней детализации.
  • Используйте настройки сборки Xcode, чтобы изменить уровень трассировки, который контролирует, сколько трассировки компилируется в продукт, например, существуют конфигурации сборки Release и Debug.
  • Если уровень трассировки не определен, мы показываем полную трассировку в симуляторе и не показываем трассировку при работе на реальном устройстве.

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

Мы определяем несколько различных уровней трассировки, чтобы разработчики могли определить, какие строки трассировки важны, и при желании отфильтровать детали более низкого уровня.

Пример кода:

- (void)myMethod:(NSObject *)xiObj
{
  TRC_ENTRY;
  TRC_DBG(@"Boring low level stuff");
  TRC_NRM(@"Higher level trace for more important info");
  TRC_ALT(@"Really important trace, something bad is happening");
  TRC_ERR(@"Error, this indicates a coding bug or unexpected condition");
  TRC_EXIT;
}

Пример вывода трассировки:

2009-09-11 14:22:48.051 MyApp[3122:207] ENTRY:+[MyClass myMethod:]
2009-09-11 14:22:48.063 MyApp[3122:207] DEBUG:+[MyClass myMethod:]:Boring low level stuff
2009-09-11 14:22:48.063 MyApp[3122:207] NORMAL:+[MyClass myMethod:]:Higher level trace for more important info
2009-09-11 14:22:48.063 MyApp[3122:207] ALERT:+[MyClass myMethod:]:Really important trace, something bad is happening
2009-09-11 14:22:48.063 MyApp[3122:207] ERROR:+[MyClass myMethod:]:Error, this indicates a coding bug or unexpected condition
2009-09-11 14:22:48.073 MyApp[3122:207] EXIT:+[MyClass myMethod:]

Наши определения трассировки:

#ifndef TRC_LEVEL
#if TARGET_IPHONE_SIMULATOR != 0
#define TRC_LEVEL 0
#else
#define TRC_LEVEL 5
#endif
#endif

/*****************************************************************************/
/* Entry/exit trace macros                                                   */
/*****************************************************************************/
#if TRC_LEVEL == 0
#define TRC_ENTRY    NSLog(@"ENTRY: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#define TRC_EXIT     NSLog(@"EXIT:  %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#else
#define TRC_ENTRY
#define TRC_EXIT
#endif

/*****************************************************************************/
/* Debug trace macros                                                        */
/*****************************************************************************/
#if (TRC_LEVEL <= 1)
#define TRC_DBG(A, ...) NSLog(@"DEBUG: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_DBG(A, ...)
#endif

#if (TRC_LEVEL <= 2)
#define TRC_NRM(A, ...) NSLog(@"NORMAL:%s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_NRM(A, ...)
#endif

#if (TRC_LEVEL <= 3)
#define TRC_ALT(A, ...) NSLog(@"ALERT: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ALT(A, ...)
#endif

#if (TRC_LEVEL <= 4)
#define TRC_ERR(A, ...) NSLog(@"ERROR: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ERR(A, ...)
#endif

Настройки Xcode:

В настройках сборки Xcode выберите «Добавить пользовательскую настройку» (щелкнув маленькую шестеренку на в нижнем левом углу экрана конфигурации сборки), затем определите новый параметр под названием GCC_PREPROCESSOR_DEFINITIONS и присвойте ему значение TRC_LEVEL = 0 .

Единственная тонкость заключается в том, что Xcode не делает ' Я не знаю, что нужно делать чистую сборку, если вы измените этот параметр, поэтому не забудьте вручную выполнить очистку, если вы измените ее.

37
ответ дан 28 November 2019 в 01:40
поделиться

Apple automatically collects crash logs from users for you, and you can download them from iTunes connect.

If that's not enough for you, I'm not aware of a toolkit but I wouldn't want to roll something on my own, personally. It seems like too much effort to develop something robust, might raise privacy concerns, and in the end, with 100,000K apps in the app store, how many users would use your application again after discovering it was buggy?

4
ответ дан 28 November 2019 в 01:40
поделиться

Знаете ли вы, что существует CrashReporter для iPhone ?

Существует ] репозиторий на github, в котором демонстрируется этот код.

Он имеет некоторые интересные функции, такие как отображение трассировки стека в ваш код и управление некоторыми специфическими вещами git, такими как хэши версий.

4
ответ дан 28 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

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