web-dev-qa-db-ja.com

iOSクラッシュログのキャッチ、デバッグ情報。キャッチして開発チームにメールで送信

最近、ユーザーが自分のデバイスに持っているアプリからのデバッグ情報を見たいという状況に遭遇しました。だから、私が探しているのは、デバイス上のログを見つけ、インラインテキストとしてメールに貼り付けて、ユーザーが送信できるようにする方法です。

何か案は?再度質問があります。1)デバイスでデバッグログを検索します2)ファイルを開き、ファイルの内容をインラインテキストとしてメールに添付します。 3)ユーザーがアプリを次回起動したときにメールで送信できるようにします。

おかげで、

49
Mobilewits

すべての入力に感謝します。私はあなたの解決策を私の問題を解決するものにまとめました。コードに実装したらすぐにアイロンをかけます。

NSLog into file ファイルにNSLogする方法 LOG2FILE

#if TARGET_IPHONE_SIMULATOR == 0    
    NSArray *paths =  
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);        
    NSString *documentsDirectory = [paths objectAtIndex:0];    
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];    
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
#endif

クラッシュをキャッチし、ファイルにも記録します

最初に、エラーを処理し、コンソールに出力する関数を作成します(また、それを使ってやりたいことは何でも)。

void uncaughtExceptionHandler(NSException *exception) {    
    NSLog(@"CRASH: %@", exception);      
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);    
    // Internal error reporting
}

次に、アプリデリゲートに例外ハンドラーを追加します。

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:  
(NSDictionary*)launchOptions
{   
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);    // Normal launch stuff
}

info.plistにCrashedという変数を設定し、この方法で読み取り/書き込みを行います

- (void)readPlist
 {
      NSString *localizedPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];        
      NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:localizedPath];

    NSString *crashed;
    crashed = [plistDict objectForKey:@"Crashed"];
}


- (void)writeToPlist
{
    NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

    [plistDict setValue:@"YES" forKey:@"Crashed"];
    [plistDict writeToFile:filePath atomically: YES];
}

アプリが起動したら、info.plistを読み取り、クラッシュログを送信するようユーザーにプロンプ​​トを表示します。

{
    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    mailComposer.mailComposeDelegate = self;[mailComposer setSubject:@"Crash Log"];
    // Set up recipients
    NSArray *toRecipients = [NSArray arrayWithObject:@"[email protected]"]; 
    [mailComposer setToRecipients:toRecipients];
    // Attach the Crash Log..
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
    NSData *myData = [NSData dataWithContentsOfFile:logPath];
    [mailComposer addAttachmentData:myData mimeType:@"Text/XML" fileName:@"Console.log"];
    // Fill out the email body text
    NSString *emailBody = @"Crash Log";
    [mailComposer setMessageBody:emailBody isHTML:NO];
    [self presentModalViewController:mailComposer animated:YES];
}
64
Mobilewits
  1. 独自のデータを記録するには、 Cocoalumberjack を使用します。 NSLogよりはるかに高速で、動的にオン/オフを切り替えることができます。また、データをファイルに保存するオプションも提供します。 NSLogはアプリの速度を低下させ、コンソールログをいっぱいにします。また、一般的にあまりログに記録したくありません。クラッシュが発生した場合、安全にロギングを行うことはできません。そのため、問題領域の場所を特定したら、そこにさらにログを追加して、それを再現しようとします。 [〜#〜] kif [〜#〜] のような自動テストフレームワークを使用する。

  2. クラッシュレポートをキャッチするには、オープンソースフレームワーク PLCrashReporter に基づいたソリューション以外に何もすべきではありません。これは safe アプリが既にアプリストアにある場合も、クラッシュをキャッチします!他の人が示唆するような例外のキャッチはお勧めしません。 この記事 をチェックして理由を確認してください!

    iTunes Connectではクラッシュレポートも表示できますが、表示するには最大2週間かかりますが、すべてではありません。 Camera +開発者が指摘した 。したがって、独自のソリューションを使用することをお勧めします。

    PLCrashReporterは、標準のAppleフォーマット済みのクラッシュレポートを送信します。シンボリック化の準備ができているので、行番号など、コードでクラッシュが発生する場所がわかります。

    PLCrashReporterに基づいたソリューションは次のとおりです。

    • QuincyKit :オープンソースクライアント+ PHPサーバー、基本的なクラッシュグループ、シンボリック化はMacから自動化できます(私はこの開発者です)
    • HockeyApp :有料サービス、QuincyKitクライアントを使用、高度なクラッシュグループ化、サーバー上で完全に行われたシンボリック化(私はこれの開発者です)
    • Bugsense :無料サービス、シンボリック化なし
    • AppBlade :25台以下のデバイスで使用する場合は無料サービス、記号化なし
    • Crashlytics :プライベートベータ、未知の機能、それらのソリューションはPLCrashReporterに基づいているようです
  3. 提案されたソリューションでは、次の起動時に自動的にデータを送信するか、ユーザーに送信することに同意するかどうかを尋ねることができます。

48
Kerni

Swiftでのロギングと分析には、SwiftyBeaverを使用できます。オープンソースSwift 2とObjective-C Framework、暗号化されたクラウドストレージ、Macアプリを含む、フル機能のログプラットフォーム。

ウェブサイト: https://swiftybeaver.com

フレームワーク(サポート): https://github.com/SwiftyBeaver/SwiftyBeaver

免責事項:私は創設者です。

5
Sebastian

これは、クラッシュを発生時にキャッチするソリューションであり、クラッシュログよりも人間が読みやすいコード情報を提供します。クラッシュログの一部は欠落しますが、ティルが言うように、とにかくそれらにアクセスできるはずです。

別のSOから、クラッシュ時に常にmainに戻るXcode 4.2に関する質問。そこの答えはこのメソッドを使用し、クラッシュを追跡するためにそれを拡張できます。

appDelegateに独自の例外ハンドラーを実装する

// on load
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"CRASH: %@", exception);
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    // Internal error reporting
}

更新私はいくつかのバックトラッキングを行い、このソリューションはZane Claesによって質問に提供されました Xcode 4.2デバッグはスタックコールを象徴しません

彼は2番目のコメントで一般的な解決策を提供しています。 「クラッシュログをファイルに書き込み、次回の起動時にユーザーに送信するように促すと便利です(リリースモードでのみ、デバッグの邪魔にならないようにします)。これにより、優れたバグレポートを取得できます。 ..そして、ユーザーは自分の問題が対処されていることを知っています」と私は皆がユーザーにこれを尋ねることを望むわけではないことを理解していますが、手伝ってくれるスーパーユーザーがいます。

もちろん、このメカニズムを表示することによって人々がイライラしないように、このプロンプトをもう一度表示しないボタンを含めることもできます。

または、情報を使用してサーバーにアクセスすることもできます(クラッシュしているときに機能するかどうかはわかりませんが、保存して、詳細を指定してPOST

4
Jesse Black

Crittercism を使用して、これを自動化しました。テストおよび本番環境でも機能します。

3
Jeff

BugSenseは、iOS用のクラッシュレポートサービスを提供します。 BugSenseは、完全にシンボリックなスタックトレースを提供するだけでなく、すべてのアプリケーションにわたるクラッシュの分析を提供します。

アプリが人気を博した場合、これらすべてのメールを手動で管理する必要がありますが、BugSenseはこれを自動的に行うため、メールよりも優れていると思います。ただし、BugSenseはオープンソースでもあるため、その内部を自由に変更して、追加機能を追加できます。

それに加えて、あなたは私たちに無料で仕事をしてもらうことができます:あなたが私たちが持って欲しいクールな新機能についてのアイデアを持っているなら、私たちはそれをやります-私たちはそれもクールだと思うなら提供します。

免責事項: BugSense-iOS.frameworkのコードを記述します。

1
Nick Toumpelis

以下のコードを使用してデバッグログをキャッチしました-Swift 4.1

var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "Logfile.txt"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)
0

SDKでTestFlightを使用する場合、これは自動化されます。それは本当に素晴らしいシステムです。ただし、テストビルドの場合のみ。

https://testflightapp.com/sdk/

0
TomSwift

Appleが提供する無料のユーティリティについては、 iphone .appファイルからNSLogステートメントを表示する方法 のRyanの回答を参照してください。

しかし、これはまだ便利な解決策ではありません。新しいビルドを購入する余裕がある場合は、アプリ内でログを変更する必要があります。 Janoは How to NSLog to a file でこれについて非常に良いアイデアを持っています。特にオプション2は、あまり手間をかけずに行う必要があります。

一般に、使用するプログラミング言語に関係なく、プロジェクトの開始時に、ファサードまたは同様の設計の背後にネイティブのログ機能を隠すことをお勧めします。

0
Kay