30

Web 開発を行うときは、致命的なエラーをキャッチしてトレースをファイルに追加し、ユーザーにメッセージを表示する特注のロガーを使用します。ファイルが変更されたかどうかをときどき確認できます。つまり、一部のユーザーがエラーに遭遇したことを意味し、何が発生したかを掘り下げることができます。

いくつかの注意点がありますが、iPhoneでも同様のものが欲しいです:

  • 開発中は、エラーのリストをリセットしたり、通知をオフにしたりするのは簡単です。
  • 開発中、コンソールの画面など、わかりやすい場所にもエラー メッセージが表示されるはずです。
  • 展開したら、分析のためにエラーをマザーシップに丁寧に送信する必要があります (次の更新でのバグ修正のため)。
  • 開発中に問題を追跡しようとするときは、Trace/Info ログを有効にします
  • ユーザーの作業を高速化するために、「リリース」のコンソール ログをオフにします
  • 電話で善良な市民になるために、それ自体を後片付けする必要があります

関連リンク

これを行うための共通のツールキットがあるように思えますが、これをどのように処理しますか?

[2011 年 10 月更新] さまざまな成熟度のいくつかの進展がありました...

  • PLCrashReporter .
  • クインシーは PLC の上に座っています。
  • Bugsenseコマーシャル クラッシュ レポーター。
  • Crittercism のクラッシュとエラーの報告 (一部の無料パッケージ、一部の有料パッケージ)。
  • テスト フライトには、クラッシュをキャッチする SDK が含まれるようになりました (ただし、アプリ ストア アプリはまだ開発アプリのみです)。
  • Test Flight と同様に、Hockeyはアドホック配布とクラッシュ レポートの組み合わせを目指しています。
4

4 に答える 4

38

私たちがしていることは次のとおりです。

  • iPhone が既存の App Store メカニズムを通じて独自のクラッシュ ダンプを処理できるようにします。 更新: iTunes Connect はクラッシュ レポートの提供に信頼性がないことがわかったので、Fabric/Crashlytics、またはCrittercismRollbarなどの競合他社を使用することをお勧めします。
  • リリースされた製品には痕跡がありません。これは、他のほとんどの iPhone アプリが行うことと一致しているようです。
  • バグが報告された場合は、トレース ビルドを使用してバグを再現します。

さらに詳細に:

  • 多数の異なるレベルの粒度で NSLog トレースにマクロを定義します。
  • Xcode ビルド設定を使用してトレース レベルを変更します。トレース レベルは、製品にコンパイルされるトレースの量を制御します。たとえば、リリースおよびデバッグ ビルド構成があります。
  • トレース レベルが定義されていない場合、シミュレータでは完全なトレースが表示され、実際のデバイスで実行されている場合はトレースが表示されません。

これをどのように記述したか、および出力がどのように見えるかを示すサンプル コードを以下に示します。

複数の異なるトレース レベルを定義して、開発者がトレースのどの行が重要であるかを識別し、必要に応じて下位レベルの詳細を除外できるようにします。

コード例:

- (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 はクリーン ビルドを実行することを認識しないため、変更した場合は手動でクリーン ビルドを実行することを忘れないでください。

于 2009-11-10T21:18:29.253 に答える
4

iPhone用のCrashReporterがあることをご存知ですか?

そのコードのデモを行うリポジトリが github にあります。

コードへのスタック トレースのマッピングや、バージョン ハッシュなどの git 固有のものの管理などの優れた機能がいくつかあります。

于 2009-11-11T23:48:33.517 に答える
4

Apple はユーザーからクラッシュ ログを自動的に収集し、iTunes Connect からダウンロードできます。

それが十分でない場合、私はツールキットを認識していませんが、個人的には自分で何かを展開したくありません. 堅牢なものを開発するのは大変な労力のように思えますが、プライバシーに関する懸念が生じる可能性があります。最終的に、アプリ ストアに 10 万件のアプリがある場合、アプリにバグがあることを発見した後、何人のユーザーがそのアプリを再び使用するでしょうか?

于 2009-11-03T15:40:04.307 に答える