iPhone のエラー ログおよび/またはレポートのベスト プラクティス
-
13-09-2019 - |
質問
Web 開発を行うときは、致命的なエラーを捕捉し、トレースをファイルに追加してユーザーにメッセージを表示するカスタムメイドのロガーを使用します。時々、ファイルが変更されたかどうかを確認することができます。つまり、一部のユーザーがエラーに遭遇したので、何が起こったのかを詳しく調べることができます。
iPhone でも同様のものが欲しいのですが、いくつか注意点があります。
- 開発中に、エラーのリストをリセットしたり、通知をオフにしたりすることは簡単なはずです。
- 開発中、エラー メッセージはコンソールの画面などのわかりやすい場所にも表示されるはずです。
- 導入後は、エラーを分析のために丁寧に母船に送信する必要があります (次のアップデートでのバグ修正のため)。
- 開発中に問題を追跡する場合は、トレース/情報ログをオンにします。
- ユーザーの作業を高速化するために、「リリース」のコンソール ロギングをオフにします。
- 電話で善良な市民になるために、後片付けをする必要があります
いくつかの関連リンク
- NSLog の代わりに GSLog を使用する
- iPhone 上のファイルにログを記録する
- Mac では、Apple System Logger と GTM Logger が最適だと言われています。 object-c ロギングのベスト プラクティス
- ログ記録に関する Jeff A のブログ エントリ
これを行うための共通のツールキットがあるように思えますが、これをどのように処理しますか?
[2011年10月更新] 成熟度は様々ですが、いくつかの開発がありました...
解決
私たちがやることは次のとおりです。
- 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
非常に柔軟で強力なので、乱用すると少し過剰になる可能性があります。さまざまなレベルのロギングをサポートします。ファイルへのログ記録は、数行のコードでオンにすることができ、ネットワーク経由で送信することもできます。