0

4.x デバイスを使用している一部のユーザーに対して、最近不思議なことに強制終了する Android アプリがあります。例外スタックを見ると、コードが実行される前にエラーが発生しているように見えますが、これを引き起こしている何かをしていると思います。

*原因やスタックを見つける方法に何か問題がありますか? それ以外の場合、これが完全なスタック トレースである場合、コードが実行される前に Android が失敗する可能性は本当にありますか? *

UncaughtExceptionHandler私は myApplicationのメソッドに myを登録しているので、後者はありそうにないonCreate()と思います。通常、ユーザーからファイルを取得します。

私のエラーログコードは以下の通りです:

アプリThread.UncaughtExceptionHandlerの . エラーが発生すると、例外情報をログインに書き込みますuncaughtException(Thread thread,Throwable ex)。これは、印刷する文字列を見つける方法です。

    // Get exception info

    String newLine = "\r\n";
    String message = "Message: " + ex.getMessage();
    String cause = "Cause: " + ex.getCause();
    StackTraceElement[] stes = ex.getStackTrace();
    String stack;

    // build stack trace

    stack = "Stack: " + newLine;

    for ( int i = 0; i < stes.length; i++ )
        {
        stack += stes[i].toString();
        stack += newLine;
        }

    // print out message
    // print out cause
    // print out stack

これをファイルに出力します:

Message: Unable to create application com.(Modified app name for anonimity).*.*Application: java.lang.IllegalArgumentException Cause: java.lang.IllegalArgumentException Stack: android.app.ActivityThread.handleBindApplication(ActivityThread.java:4254) android.app.ActivityThread.access$1400(ActivityThread.java:140) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1297) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:137) android.app.ActivityThread.main(ActivityThread.java:4921) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:511) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) dalvik.system.NativeStart.main(Native Method)

PS はい、ACRA については知っていますが、現時点では使用したくありません。

4

2 に答える 2

1

アプリケーションが例外を引き起こしている可能性があり、その例外がキャッチされて再スローされます。

最後の例外のスタックトレースのみを出力しています。おそらく、この例外には原因があります (ex.getCause()そうではありませんnull)。この場合、原因のスタックトレースも出力する必要があります (おそらく原因の原因..)。

これを自分で行う必要はありません。Throwableこれには、完全なスタックトレースとバックトレースを出力する素晴らしい方法がありますPrintStream:

public void printStackTrace(PrintStream s)

その後printStream、ログに書き込むだけです。

于 2013-03-27T19:11:59.827 に答える