Подтвердить что ты не робот

Рекомендации по регистрации ошибок и/или отчетности для iPhone

Когда я занимаюсь веб-разработкой, я использую настраиваемый регистратор, который ловит фатальные ошибки и добавляет трассировку в файл и выводит сообщение пользователю. Иногда я могу посмотреть, изменился ли файл, а значит, какой-то пользователь столкнулся с ошибкой, и я могу вникнуть, чтобы увидеть, с чем они столкнулись.

Мне хотелось бы что-то подобное на iphone, с некоторыми оговорками:

  • При разработке, должно быть тривиально reset список ошибок или отключить уведомление.
  • При разработке сообщения об ошибках также должны отображаться в каком-то очевидном месте, например, на экране в консоли
  • После развертывания ошибки должны вежливо отправляться на материнскую плату для анализа (для исправления ошибок в следующем обновлении).
  • Включить ведение журнала Trace/Info при попытке отслеживания проблемы во время разработки.
  • Отключить ведение журнала консоли для "Release", чтобы ускорить работу пользователя.
  • Нужно очистить после себя, чтобы быть хорошим гражданином по телефону.

Некоторые связанные ссылки

Кажется, что для этого будет общий инструментарий - как вы справляетесь с этим?

[Update Oct 2011] Были некоторые события, имеющие различную зрелость...

  • PLCrashReporter.
  • Quincy находится поверх ПЛК.
  • Bugsense коммерческий репортер аварийной ситуации.
  • Crittercism отчеты о сбоях и ошибках (некоторые бесплатные пакеты, некоторые платные).
  • В тестовом полете теперь есть SDK, который ловит сбои (но еще не для приложений приложений для приложений, а только для приложений).
  • Как и тестовый полет, Hockey направлен на объединение специального распределения с отчетами о сбоях.
4b9b3361

Ответ 1

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

  • Пусть iPhone обрабатывает свои собственные аварийные дампы через существующие механизмы App Store. Обновить: если iTunes Connect оказался ненадежным при предоставлении отчетов о сбоях, я начал использовать 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 не знает, как сделать чистую сборку, если вы измените этот параметр, поэтому не забудьте вручную очистить, если вы его измените.

Ответ 2

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

Если этого недостаточно для вас, я не знаю инструментария, но лично я бы не хотел откатывать что-то самостоятельно. Похоже, что слишком много усилий для разработки чего-то надежного, может вызвать проблемы конфиденциальности, а в конце концов, с приложениями в 100 000 КБ в магазине приложений, сколько пользователей будут использовать ваше приложение снова после обнаружения, что это было ошибкой?

Ответ 3

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

В github есть репозиторий, в котором отображаются демо.

В нем есть некоторые интересные функции, такие как сопоставление трассировки стека с вашим кодом и управление некоторыми git конкретными вещами, такими как хеш-версии.

Ответ 4

Я очень рекомендую Робби Хэнсона CocoaLumberJack: https://github.com/robbiehanson/CocoaLumberjack

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