Androidのクラッシュログを取得する方法


155

市場にはない(デバッグ証明書で署名された)アプリがありますが、アプリケーションがクラッシュするたびにクラッシュログデータを取得したいと考えています。アプリがクラッシュした理由のログはどこにありますか?

回答:


139

アプリが他のユーザーによってダウンロードされてリモートデバイスでクラッシュしている場合は、Androidエラー報告ライブラリ(このSOの投稿で参照されている)を調べることをお勧めします。自分のローカルデバイス上にある場合はLogCat. 、クラッシュが発生したときにデバイスがホストマシンに接続されていなくても、デバイスを接続してadb logcatコマンドを発行すると、logcat履歴全体がダウンロードされます(少なくともバッファリングされます。これは通常、大量のログデータです。無限ではありません)。これらのオプションのどちらかがあなたの質問に答えますか?そうでない場合、あなたが探しているものをもう少し明確にしようとすることができますか?


2
adb logcatコマンドの使用方法を詳しく説明できますか?これを/ SDK / toolsディレクトリ内で実行しますか?注意すべきフラグはありますか?など
jesses.co.tt 2013年

2
@ jesses.co.ttはい、adb logcatadbがあるディレクトリから実行します。または、Eclipseプラグインに含まれているSDKツールを使用できます
Chris Thompson

2
Crashlyticsは、私が今まで使った中で最高のリモート例外ロギングソフトウェアです。それは私のすべてのアプリで消えます、それをチェックしてください。
Jacksonkr 2014

adb.exeはにあり$SDK_DIR/platform-tools/ます。エラーを表示するには:.\adb.exe logcat -v time *:E
Harun

53

これを行う方法は、Thread.UncaughtExceptionHandlerインターフェースを実装して、それをThread.setDefaultUncaughtExceptionHandler()アクティビティのの最初に渡すことonCreate()です。これが実装クラスTopExceptionHandlerです。

public class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
    private Thread.UncaughtExceptionHandler defaultUEH;
    private Activity app = null;

    public TopExceptionHandler(Activity app) {
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        this.app = app;
    }

    public void uncaughtException(Thread t, Throwable e) {
        StackTraceElement[] arr = e.getStackTrace();
        String report = e.toString()+"\n\n";
        report += "--------- Stack trace ---------\n\n";
        for (int i=0; i<arr.length; i++) {
            report += "    "+arr[i].toString()+"\n";
        }
        report += "-------------------------------\n\n";

        // If the exception was thrown in a background thread inside
        // AsyncTask, then the actual exception can be found with getCause

        report += "--------- Cause ---------\n\n";
        Throwable cause = e.getCause();
        if(cause != null) {
            report += cause.toString() + "\n\n";
            arr = cause.getStackTrace();
            for (int i=0; i<arr.length; i++) {
                report += "    "+arr[i].toString()+"\n";
            }
        }
        report += "-------------------------------\n\n";

        try {
            FileOutputStream trace = app.openFileOutput("stack.trace", 
                                                        Context.MODE_PRIVATE);
            trace.write(report.getBytes());
            trace.close();
        } catch(IOException ioe) {
        // ...
        }

        defaultUEH.uncaughtException(t, e);
    }
}

注AndroidフレームワークのdefaultUEHで処理できるようにします。

アクティビティの上部で、上記のクラスのインスタンスを次のように登録します。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
...

このハンドラーは、トレースをファイルに保存します。場合はReaderScope次回を再起動し、それがファイルを検出し、彼/彼女は、開発者にそれを電子メールで送信したい場合は、ユーザーに求めます。

スタックトレースを電子メールで送信するには、次のコードを実行してそれを電子メールにパックします。

try {
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(ReaderScopeActivity.this.openFileInput("stack.trace")));
    while((line = reader.readLine()) != null) {
        trace += line+"\n";
    }
} catch(FileNotFoundException fnfe) {
    // ...
} catch(IOException ioe) {
    // ...
}

Intent sendIntent = new Intent(Intent.ACTION_SEND);
String subject = "Error report";
String body = "Mail this to appdeveloper@gmail.com: " + "\n" + trace + "\n";

sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"readerscope@altcanvas.com"});
sendIntent.putExtra(Intent.EXTRA_TEXT, body);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.setType("message/rfc822");

ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));

ReaderScopeActivity.this.deleteFile("stack.trace");

または、ACRAエラー報告システムを使用することもできます。プロジェクトライブラリにACRA.jarを含めるだけで、ランチャーアクティビティクラス宣言の前に以下のコードスニペットを使用できます。

@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT) 

またはコンソールからこれを試すことができます:-

adb logcat -b crash 

行defaultUEH.uncaughtException(t、e);にはなりません。メソッドuncaughtException()を無限に呼び出しますか?
ミカエルベルジェロンネロン

@MickaelBergeronNéronいいえ-同じThrowableをトップレベルのハンドラーに転送するだけです。
formatBCE 2018


36

コンソールからこれを試すことができます:

adb logcat --buffer=crash 

このオプションの詳細:

adb logcat --help

...

  -b <buffer>, --buffer=<buffer>         Request alternate ring buffer, 'main',
                  'system', 'radio', 'events', 'crash', 'default' or 'all'.
                  Multiple -b parameters or comma separated list of buffers are
                  allowed. Buffers interleaved. Default -b main,system,crash.

9

Eclipseを使用している場合は、実行せずにデバッグを使用してください。デバッグパースペクティブ(右上)にいることを確認します。ログを印刷するには、 'Resume'(F8)を数回押す必要がある場合があります。クラッシュログは下部のLogcatウィンドウに表示されます。フルスクリーンでダブルクリックし、下部までスクロールしてください。エラーの赤いテキストが表示されます。クラッシュトレースは次のようになります。

09-04 21:35:15.228: ERROR/AndroidRuntime(778): Uncaught handler: thread main exiting due to uncaught exception
09-04 21:35:15.397: ERROR/AndroidRuntime(778): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dazlious.android.helloworld/com.dazlious.android.helloworld.main}: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.os.Looper.loop(Looper.java:123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.main(ActivityThread.java:3948)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at java.lang.reflect.Method.invokeNative(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at java.lang.reflect.Method.invoke(Method.java:521)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at dalvik.system.NativeStart.main(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.example.android.helloworld.main.onCreate(main.java:13)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     ... 11 more

これの重要な部分は

09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.example.android.helloworld.main.onCreate(main.java:13)

それらは、onCrateメソッドのmain.javaの13行目の境界外の例外であったことを示しています。


9

Apphanceを使用できます。これはクロスプラットフォームサービス(現在は主にAndroid、iOS、他のプラットフォームが進行中)であり、リモートで任意のモバイルデバイス(Android、iOS-現在開発中の他のデバイス)をデバッグできます。これは単なるクラッシュログだけではなく、実際にはログ、テスターに​​よる問題の報告、クラッシュログなど、はるかに多くのことです。統合には約5分かかります。現在、クローズドベータ版へのアクセスをリクエストできます。

免責事項:私は、Apphanceの背後にあり、その共同作成者であるPolideaのCTOです。

更新:Apphanceはもはやクローズドベータ版です!アップデート2:Apphanceはhttp://applause.comオファリングの一部として利用可能です


2
私はただ見栄えを試し、それが好きでした。apphance libをアプリに統合するときに、ドキュメントは重要なポイントを逃しました。Eclipse ADTの最新バージョンでは、この SOの回答で説明さlibsれているように、apphance.jarをディレクトリに配置する必要があります。このgithubコミットは、apphanceを使用するためにWorldMapアプリに加える必要がある変更を示しています。
JohnnyLambada

@HohnnyLambadaコメントありがとうございます。ドキュメントを更新して、これをより明確にしました。
Piotr Duda

12
これはそれほど多くの上向きの矢印を取得するべきではなく、ほとんどの開発予算(月額2,500ドル!)の10倍のコストがかかります
user26676

このコメントの日付での見かけは404です。
DaveP 2016

正しい。uTestはそれからずっと前に大騒ぎしていて、そのすべての製品(Aphhanceの機能を含む)をApplauseにブランド変更しました。だから今それはだapplause.com
Jarek Potiuk


4

ACRAはこちらからご利用いただけます。このライブラリをプロジェクトに含めて構成すると、クラッシュレポートを(メールまたはgdocsに)受け取ることができます。英語が下手でごめんなさい。


4

基本的なクラッシュレポートツールを探している場合は、crashlyticsをお試しください

より高度なレポートツールが必要な場合は、Checkout Gryphonetを使用してください。発生したすべてのクラッシュと、クラッシュを引き起こした正確なコード行、およびユーザーがクラッシュ前に実行した手順などを示す自動マーカーを記録します。

幸運を!



2

私はあなたのすべての問題を解決するためにこのライブラリを作成しました。 Crash Reporterは、すべてのクラッシュをキャプチャしてローカルのデバイスに記録するための便利なツールです

この依存関係を追加するだけでよいのです。

compile 'com.balsikandar.android:crashreporter:1.0.1'

ローカルでデバイス内のすべてのクラッシュを見つけ、都合のよいときに修正します。クラッシュは、追跡しやすい日付と時刻の形式を使用して保存されます。さらに、以下のメソッドを使用してログに記録された例外をキャプチャするためのAPIも提供します。

CrashRepoter.logException(Exception e)

デバイスのクラッシュログを取得するために使用したJavaクラスは何ですか?
Xenolion 2018年

Thread.UncaughtExceptionHandlerインターフェイスは、未処理のクラッシュをすべてキャプチャするために使用されます。これは同じgithub.com/MindorksOpenSource/CrashReporter/blob/master/…の実装です。
バリ島

わかりました、これをチェックしてください...!ありがとう
Xenolion 2018

2

これは、すべてのログをテキストファイルにダンプするのに役立つソリューションです。

adb logcat -d > logs.txt


0

電話がコンピューターに接続されているときにクラッシュログを探しているだけの場合は、EclipseのDDMSビューを使用すると、デバッグ中にアプリがクラッシュしたときに、レポートがDDMS内のLogCatに表示されます。


0

1)USB経由で電話を接続します(開発者向けデバッグオプションが有効)

2)ターミナルを開き、Android SDK(Macの場合)に移動します。

cd ~/Library/Android/sdk/platform-tools

3)(ターミナルの)そのディレクトリからLogcatを実行して、ログの一定のフローを生成します(Macの場合):

./adb logcat

4)クラッシュしたアプリを開いてクラッシュログを生成する

5)Ctrl + Cでターミナルを停止し、クラッシュしたアプリに関連するログを探します。次のようなメッセージが表示される場合があります。

AndroidRuntime: FATAL EXCEPTION: main


0

このPOST基づいて、このクラスを「TopExceptionHandler」の代わりとして使用します

class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
private String line;

public TopExceptionHandler(Activity app) {
    this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    this.app = app;
}

public void uncaughtException(Thread t, Throwable e) {




    StackTraceElement[] arr = e.getStackTrace();
    String report = e.toString()+"\n\n";
    report += "--------- Stack trace ---------\n\n";
    for (int i=0; i<arr.length; i++) {
        report += "    "+arr[i].toString()+"\n";
    }
    report += "-------------------------------\n\n";

    // If the exception was thrown in a background thread inside
    // AsyncTask, then the actual exception can be found with getCause

    report += "--------- Cause ---------\n\n";
    Throwable cause = e.getCause();
    if(cause != null) {
        report += cause.toString() + "\n\n";
        arr = cause.getStackTrace();
        for (int i=0; i<arr.length; i++) {
            report += "    "+arr[i].toString()+"\n";
        }
    }
    report += "-------------------------------\n\n";

    try {
        FileOutputStream trace = app.openFileOutput("stack.trace",
                Context.MODE_PRIVATE);
        trace.write(report.getBytes());
        trace.close();



        Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("message/rfc822");
        i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"kevineyni@gmail.com"});
        i.putExtra(Intent.EXTRA_SUBJECT, "crash report azar");
        String body = "Mail this to kevineyni@gmail.com: " + "\n" + trace + "\n";
        i.putExtra(Intent.EXTRA_TEXT   , body);
        try {
            startActivity(Intent.createChooser(i, "Send mail..."));
        } catch (android.content.ActivityNotFoundException ex) {
           // Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
        }






      //  ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));

        //ReaderScopeActivity.this.deleteFile("stack.trace");

    } catch(IOException ioe) {
        // ...
    }

    defaultUEH.uncaughtException(t, e);
}

private void startActivity(Intent chooser) {
}

}

.....

同じJavaクラスファイル(アクティビティ).....

Public class MainActivity.....

.....

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));

.....


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.