質問

「PLCrashReport」を使用してクラッシュ情報を収集し、アプリをより安定させようとしましたが、レポートは次のようなものであることがわかりました(コールスタックさえありません。どうやって使用すればよいでしょうか?)。

「例外:」の部分、例外:(ヌル):(null)、これは「例外名」と「例外理由」であるはずですが、ほとんどの場合「ヌル」です。理由はわかりません。正常な値が存在することもありますが、あまり役に立たないと思います...

2009-11-13 23:43:04 +0800にクラッシュしました-Signal Sigsegv(code segv_accerr、address = 0xfffffffffc0f4186b)

  • 例外:(ヌル):(null) - スレッド 0:

    • クラッシュしました:1
    • スタック(54フレーム):、 n 806128664、 n 807756495、 n 816280840、 n 816247 068、 n 817901396、 n 807756495、 n 816280840、 n 8179108、 n 816285160、 n 816406620、 n 807756495、 n 806130012、 n 119241、 n 812165747、 n 8121644839、 n 812379009、 n 8181278880、 n 807853232 n 818792. 2176、 n 818130772、 n 816625560、 n 816626608、 n 816627024、 n 816641892、 n 816651496、 n 81654224、 n 146455、 n 816654224、 n 8161915、 n 8161915 n 818227300、 n 807923363、 n 816119156、 n 816119004、 n 816524332、 n 816525956、 n 816521588、 n 816212028、 n 816151252、 n 8164780、 n 82775876 n 837343488、 n 821391952、 n 807840887、 n 807836793、 n 807834407、 n 827752032、 n 816118388、 n816157144、 n 20421
役に立ちましたか?

解決

私はそれを使用していないが、私は、あなたが登録するまで、すべてを出したセグメンテーションフォールトを持っていたので、あなたはどんなの詳細を取得していないかなり確信しています。それは他のすべてと一緒に死亡したため、PLCrashReportインスタンスが報告することはできません。

アプリはハードダウンした場合、あなたが任意の詳細を取得することはありませんので、

PLCrashReportインスタンスは、アプリケーション自体の中で実行されます。

他のヒント

スタックトレースとは何ですか?

メソッドの 1 つが呼び出されるたびに、これがスタックに置かれます。スタック トレースは、アプリがクラッシュしたクラスとメソッドを見つける方法であり、多くの場合、バグを 1 行に絞り込むことができます。

もちろん、これを行うには、16 進数の負荷全体ではなく、スタック トレースが読み取り可能である必要があります。

アトスをチェックしてください。

このようなことが再び起こらないようにするために、atos を使用してこの呼び出しスタックを解釈できます。を参照してください。 スタックトレース これらの数値を意味のあるメソッドに変換する方法に関するディスカッションとコードについては、Cocoa Dev wiki のページを参照してください。

これをクラッシュ レポーターと統合する方法を見つける必要があります。私は UKCrashReporter を使用しており、キャッチされなかった例外がある場合に読み取り可能なスタック トレースをクラッシュ レポートに追加するように Uli のコードを変更しました。

コードサンプル

私は ESStackTrace クラスからインスピレーションを得て、次のようにします。

-(void)logAndSaveStackTrace {
    NSString *stackTrace = [[self userInfo] objectForKey:NSStackTraceKey];
    NSString *atosCommand;
    if (stackTrace) {
        // If the stack trace key is present, pull out the addresses and convert to method names using atos.
        atosCommand = [NSString stringWithFormat:@"/usr/bin/atos -p %d %@ | tail -n +3 | head -n +%d | c++filt | cat -n",
                         [[NSProcessInfo processInfo] processIdentifier],
                         stackTrace,
                         ([[stackTrace componentsSeparatedByString:@"  "] count] - 4)];

    } else {
        // If there isn't a stack trace key or it's nil, try and work out the stack using the internal callStackReturn addresses method.
        NSArray *stackTraceArray = [self callStackReturnAddresses];
        atosCommand = [NSString stringWithFormat:@"/usr/bin/atos -p %d %@",
                       [[NSProcessInfo processInfo] processIdentifier],
                       [stackTraceArray componentsJoinedByString:@" "]];
    }

    NSString *readableStackTrace = [ShellTask executeShellCommandSynchronously:atosCommand];

    NSString *exceptionMessageForCrashReport = [NSString stringWithFormat:@"An exception of type %s occured.\n%s\nStack trace:\n%@", 
                                                [[self name] cStringUsingEncoding:NSUTF8StringEncoding], 
                                                [[self reason] cStringUsingEncoding:NSUTF8StringEncoding],
                                                readableStackTrace];

    [[NSUserDefaults standardUserDefaults] setObject:exceptionMessageForCrashReport forKey:@"uncaughtExceptionReport"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    // Log the exception to the console too.
    NSLog(@"%@", exceptionMessageForCrashReport);
}

依存関係 アホイ!

もちろん、このアプローチの問題の 1 つは、atos への依存関係が導入されていることです。10.5以降には標準で搭載されているとのことですが、違うかもしれません。最終的には、アプリが atos を見つけられない場合にそれを追加する小さなインストーラーを作成するつもりです。

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