質問

Web 開発を行うときは、致命的なエラーを捕捉し、トレースをファイルに追加してユーザーにメッセージを表示するカスタムメイドのロガーを使用します。時々、ファイルが変更されたかどうかを確認することができます。つまり、一部のユーザーがエラーに遭遇したので、何が起こったのかを詳しく調べることができます。

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

  • 開発中に、エラーのリストをリセットしたり、通知をオフにしたりすることは簡単なはずです。
  • 開発中、エラー メッセージはコンソールの画面などのわかりやすい場所にも表示されるはずです。
  • 導入後は、エラーを分析のために丁寧に母船に送信する必要があります (次のアップデートでのバグ修正のため)。
  • 開発中に問題を追跡する場合は、トレース/情報ログをオンにします。
  • ユーザーの作業を高速化するために、「リリース」のコンソール ロギングをオフにします。
  • 電話で善良な市民になるために、後片付けをする必要があります

いくつかの関連リンク

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

[2011年10月更新] 成熟度は様々ですが、いくつかの開発がありました...

  • PLCクラッシュレポーター.
  • クインシー PLCの上に置きます。
  • バグセンス 商業事故レポーター。
  • 批判主義 クラッシュとエラーのレポート (一部の無料パッケージと一部の有料パッケージ)。
  • 試験飛行 クラッシュを捕捉する SDK が追加されました (ただし、アプリ ストア アプリについてはまだ対応しておらず、開発アプリのみです)。
  • 試験飛行のように、 ホッケー アドホック配布とクラッシュレポートを組み合わせることが目的です。
役に立ちましたか?

解決

私たちがやることは次のとおりです。

  • iPhone が独自のクラッシュ ダンプを処理できるようにします。 既存の App Store メカニズム. アップデート:iTunes Connect はクラッシュレポートを提供する点で信頼性が低いことがわかったので、使用することをお勧めします ファブリック/クラッシュリティクス, 、または次のような競合他社 批判主義 または ロールバー.
  • 私たちがリリースした製品にはトレースインはありませんが、これは他のほとんどの 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 がクリーン ビルドを実行するかどうかを認識しないため、変更する場合は忘れずに手動でクリーン ビルドを実行してください。

他のヒント

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

それで十分でない場合は、ツールキットについては知りませんが、個人的には、自分で何かを開発したくはありません。堅牢なものを開発するには労力がかかりすぎるように思えますし、プライバシー上の懸念が生じる可能性もあります。結局のところ、アプリ ストアに 100,000 個のアプリが存在する中で、アプリケーションにバグがあることに気付いた後に、そのアプリケーションを再び使用するユーザーは何人いるでしょうか?

知っていますか iPhone用クラッシュレポーター 存在しますか?

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

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

ロビー・ハンソンの CocoaLumberJack を強くお勧めします。 https://github.com/robbiehanson/CocoaLumberjack

非常に柔軟で強力なので、乱用すると少し過剰になる可能性があります。さまざまなレベルのロギングをサポートします。ファイルへのログ記録は、数行のコードでオンにすることができ、ネットワーク経由で送信することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top