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

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

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

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

Некоторые ссылки по теме

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

[Обновление за октябрь 2011 года] Были некоторые события различной степени зрелости ...

  • ПЛКрашРепортер .
  • Куинси сидит на вершине ПЛК.
  • Bugsense коммерческий аварийный репортер.
  • Crittercism аварии и сообщения об ошибках (некоторые бесплатные пакеты, некоторые платные).
  • У тестового полета теперь есть SDK, который ловит сбои (но пока не для приложений из магазина приложений, только для разработчиков приложений).
  • Как и «Испытательный полет», Hockey стремится объединить разовое распределение с отчетами о сбоях.
Я пытался понять, почему я получил только 50 повторений за мой принятый ответ. Похоже, что Stackoverflow автоматически принял мой ответ и дал мне половину вознаграждения: meta.stackexchange.com/questions/26510/…
Dan J 16.11.2009 20:57:13
Облом - как автор, я бы принял ваш ответ, но к тому времени, когда я вернулся, чтобы проверить вещи, Stackoverflow уже принял ответ от моего имени, который я считал грубым. Это было всего несколько дней. Хорошо - я только что проголосовал за ваш ответ для хорошей меры! Спасибо.
JJ Rohrer 17.11.2009 11:50:27
GSLog зависит от GraphicsServices, который представляется частной платформой.
johndpope 12.10.2011 02:43:06
4 ОТВЕТА
РЕШЕНИЕ

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

  • Пусть 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
13.01.2018 01:02:44
Почему бы не контролировать уровни трассировки, создав новую конфигурацию сборки?
mahboudz 12.01.2010 20:46:01
Да, я уже предложил это в своем ответе (второй набор пунктов пули, второй пункт). Конфигурация сборки "Debug" устанавливает TRC_LEVEL = 0, а сборки "Release" - TRC_LEVEL = 5.
Dan J 13.01.2010 17:26:48
Это все еще довольно высоко в результатах Google. Не могли бы вы обновить с помощью таких инструментов, как crashlytics и Swift Frameworks, таких как SwiftyBeaver? (Я упоминаю эти два, потому что я лично использую их, но в зависимости от того)
Doug Mead 11.01.2018 00:14:25

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

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

4
3.11.2009 15:40:04
В самом деле? Нужно ли мне уделять больше внимания тем файлам «Что нового в этой версии»?
JJ Rohrer 3.11.2009 15:43:27
Это обрабатывает некоторый элементарный стек и отчетность.
JJ Rohrer 3.11.2009 15:53:12
:) Я думаю, что они начали делать это в начале этого года. Хотя это немного сложно - в разделе «Управление приложениями» нажмите «Детали приложения» и ... о, подождите, только что вышла последняя версия моего приложения, поэтому я не могу просматривать журналы сбоев. Так что это минус - Apple, кажется, только делает доступными журналы из текущей версии вашего приложения.
bpapa 3.11.2009 15:55:09
Хорошо, я вижу это и даже смутно вспоминаю, что видел это раньше тоже. Но так ли это? Итак, допустим, у меня есть логика if-then-else-logicer, и, конечно, было бы лучше сообщить пользователю о том, что случилось что-то плохое, и записать дополнительную информацию в журнал, а не просто «сбой»? Можете ли вы каким-то образом вызвать сбой, но каким-то образом добавить дополнительную информацию в дамп ядра, которая будет полезна при отладке? Возможно, ответ на этот вопрос таков: «Современное состояние здесь довольно незрелое, за исключением встроенных загрузок Apple при аварийном завершении». Я действительно надеюсь на что-то большее… умное.
JJ Rohrer 4.11.2009 20:28:51
Будучи разработчиком и пользователем Iphone, я очень рад, что приложение просто рушится, потому что меня редко волнует, почему оно рухнуло. если это служебное приложение, то до тех пор, пока оно не теряет мои данные, мне все равно. Я думаю, что я должен согласиться с bpapa.
Toby Allen 7.11.2009 14:41:31

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

На github есть репозиторий, который демонстрирует этот код.

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

4
11.11.2009 23:48:33
Круто - похоже, это может быть полезно.
JJ Rohrer 15.11.2009 21:41:31

Я настоятельно рекомендую «CocoaLumberJack» Робби Хансона: https://github.com/robbiehanson/CocoaLumberjack

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

2
23.04.2013 16:21:25