Bagaimana cara mendapatkan log kerusakan Android?


155

Saya memiliki aplikasi yang tidak ada di pasar (ditandatangani dengan sertifikat debug), tetapi ingin mendapatkan data log kerusakan, setiap kali aplikasi saya mogok. Di mana saya dapat menemukan log mengapa aplikasi saya mogok?

Jawaban:


139

Jika aplikasi Anda sedang diunduh oleh orang lain dan mogok di perangkat jarak jauh, Anda mungkin ingin melihat ke perpustakaan pelaporan kesalahan Android (dirujuk dalam pos SO ini ). Jika hanya di perangkat lokal Anda sendiri, Anda dapat menggunakan LogCat. Bahkan jika perangkat tidak terhubung ke mesin host ketika terjadi kecelakaan, menghubungkan perangkat dan mengeluarkan adb logcatperintah akan mengunduh seluruh riwayat logcat (setidaknya sejauh itu buffered yang biasanya merupakan loooot data log, hanya saja tidak terbatas). Apakah salah satu dari opsi itu menjawab pertanyaan Anda? Jika tidak, bisakah Anda mencoba menjelaskan apa yang Anda cari lebih banyak?


2
dapatkah Anda merinci cara menggunakan perintah adb logcat? Apakah saya menjalankan ini di dalam direktori / SDK / tools? Apakah ada bendera yang harus saya perhatikan? dll
jesses.co.tt

2
@ jesses.co.tt Yap, jalankan saja adb logcatdari direktori adb apa pun berada. Atau Anda dapat menggunakan alat SDK yang termasuk dalam plugin Eclipse
Chris Thompson

2
Crashlytics adalah perangkat lunak logging pengecualian jarak jauh terbaik yang pernah saya gunakan. Itu keluar di semua aplikasi saya, periksa.
Jacksonkr

adb.exe terletak di $SDK_DIR/platform-tools/. Untuk menampilkan kesalahan:.\adb.exe logcat -v time *:E
Harun

53

Cara untuk melakukannya adalah dengan mengimplementasikan Thread.UncaughtExceptionHandlerantarmuka dan meneruskannya ke Thread.setDefaultUncaughtExceptionHandler()awal Aktivitas Anda onCreate(). Inilah kelas implementasi 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);
    }
}

Catatan Kami membiarkan kerangka kerja AndroidUEUE untuk menanganinya.

Di bagian atas Aktivitas Anda daftarkan instance dari kelas di atas seperti ini:

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

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

Pawang ini menyimpan jejak dalam sebuah file. KapanReaderScope memulai kembali lain kali, ia mendeteksi file dan meminta pengguna jika ia ingin mengirimkannya melalui email kepada pengembang.

Untuk mengirim email ke Stack Trace, jalankan kode berikut untuk mengemasnya dalam email.

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");

Atau Anda juga dapat menggunakan ACRA Error Reporting System. Cukup sertakan ACRA.jar di libs proyek Anda dan gunakan snipet kode di bawah ini sebelum deklarasi kelas aktivitas peluncur Anda

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

atau Anda dapat mencoba ini dari konsol: -

adb logcat -b crash 

Baris defaultUEH.uncaughtException tidak akan (t, e); panggil metode uncaughtException () tanpa batas?
Mickael Bergeron Néron

@ MickaelBergeronNéron no - hanya akan mentransfer Throwable yang sama ke handler tingkat atas.
formatBCE


36

Anda dapat mencoba ini dari konsol:

adb logcat --buffer=crash 

Info lebih lanjut tentang opsi ini:

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

Jika Anda menggunakan Eclipse, pastikan Anda menggunakan debug dan tidak dijalankan. Pastikan Anda berada dalam perspektif debug (kanan atas) Anda mungkin harus menekan 'Lanjutkan' (F8) beberapa kali agar log dapat dicetak. Log kerusakan akan berada di jendela Logcat di bagian bawah - klik dua kali untuk layar penuh dan pastikan Anda menggulir ke bawah. Anda akan melihat teks merah untuk kesalahan, jejak kerusakan akan menjadi sesuatu seperti

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

Bagian penting untuk ini adalah

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)

yang memberi tahu kami itu adalah array di luar batas kecuali pada baris 13 main.java dalam metode onCrate.


9

Anda dapat menggunakan Apphance. Ini adalah layanan lintas-platform (sekarang terutama Android, iOS dengan platform lain dalam perjalanannya) yang memungkinkan untuk melakukan debug jarak jauh dengan semua perangkat seluler (Android, iOS sekarang - yang lain sedang dalam pengembangan). Ini jauh lebih dari sekedar crashlog, sebenarnya jauh lebih: logging, pelaporan masalah oleh penguji, crashlogs. Diperlukan sekitar 5 menit untuk berintegrasi. Saat ini Anda dapat meminta akses ke beta tertutup.

Penafian: Saya CTO dari Polidea, sebuah perusahaan di belakang Apphance dan salah satu pembuatnya.

Pembaruan: Apphance bukan lagi beta tertutup! Pembaruan 2: Penampilan tersedia sebagai bagian dari penawaran http://applause.com


2
Saya baru saja mencoba apphance dan menyukainya. Dokumen kehilangan titik kunci ketika mengintegrasikan lib apphance ke dalam aplikasi Anda; dengan versi terbaru dari Eclipse ADT, Anda harus meletakkan apphance.jar di libsdirektori seperti yang dijelaskan oleh SO ini . Komit github ini menunjukkan perubahan yang perlu saya lakukan pada aplikasi WorldMap saya untuk menggunakan apphance.
JohnnyLambada

@HohnnyLambada Terima kasih atas komentar Anda. Kami telah memperbarui dokumentasi untuk membuatnya lebih jelas.
Piotr Duda

12
ini seharusnya tidak mendapatkan terlalu banyak panah, biayanya 10x lebih banyak daripada kebanyakan anggaran pengembangan ($ 2.500 per bulan!)
user26676

apphance adalah 404 pada tanggal komentar ini.
DaveP

Benar. Sudah lama sekali oleh uTest yang kemudian mengganti seluruh penawaran mereka (termasuk fitur Aphhance) menjadi Tepuk Tangan. Jadi sekarang ini applause.com
Jarek Potiuk


4

Anda dapat menggunakan ACRA dari ini . Dengan menyertakan pustaka ini ke proyek Anda dan mengonfigurasinya, Anda dapat menerima (ke email atau gdocs) laporan kerusakan mereka. Maaf untuk bahasa Inggris saya yang buruk.


4

Jika Anda mencari alat pelaporan kerusakan dasar, coba crashlytics .

Jika Anda menginginkan alat pelaporan yang lebih canggih, Checkout Gryphonet . Ini mencatat semua crash yang terjadi bersama dengan baris kode yang menyebabkan crash bersama dengan spidol otomatis yang menunjukkan kepada Anda langkah-langkah yang diambil pengguna sebelum crash dan banyak lagi.

Semoga berhasil!



2

Saya telah membuat perpustakaan ini untuk menyelesaikan semua masalah Anda. Crash Reporter adalah alat praktis untuk menangkap semua kerusakan Anda dan mencatatnya di perangkat secara lokal

Cukup tambahkan ketergantungan ini dan Anda siap melakukannya.

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

Temukan semua kerusakan Anda di perangkat secara lokal dan perbaiki sesuka Anda. Kecelakaan disimpan menggunakan format tanggal dan waktu yang mudah dilacak. Plus itu juga menyediakan API untuk menangkap Pengecualian Tercatat menggunakan metode di bawah ini.

CrashRepoter.logException(Exception e)

Apa kelas Java yang Anda gunakan untuk mendapatkan Crash Logs perangkat?
Xenolion

Antarmuka Thread.UncaughtExceptionHandler digunakan untuk menangkap semua crash yang tidak ditangani. Berikut adalah implementasi untuk github.com/MindorksOpenSource/CrashReporter/blob/master/… yang sama .
Bali

Oke, aku periksa ini ...! Terima kasih
Xenolion

2

Berikut adalah solusi yang dapat membantu Anda membuang semua log ke file teks

adb logcat -d > logs.txt


0

Jika Anda hanya mencari log kerusakan saat ponsel Anda terhubung ke komputer, gunakan tampilan DDMS di Eclipse dan laporan ada di sana di LogCat dalam DDMS ketika aplikasi Anda mogok saat debugging.


0

1) Hubungkan Telepon melalui USB (dengan opsi Pengembang Debug diaktifkan)

2) Buka Terminal dan Arahkan ke Android SDK Anda (untuk Mac):

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

3) Logcat dari direktori itu (di terminal Anda) untuk menghasilkan aliran log yang konstan (untuk Mac):

./adb logcat

4) Buka aplikasi Anda yang macet untuk menghasilkan log macet

5) Ctrl + C untuk menghentikan terminal dan mencari log yang terkait dengan aplikasi yang macet. Itu bisa mengatakan sesuatu seperti berikut:

AndroidRuntime: FATAL EXCEPTION: main


0

Berdasarkan POST ini , gunakan kelas ini sebagai pengganti "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) {
}

}

.....

dalam file kelas java yang sama (Aktivitas) .....

Public class MainActivity.....

.....

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

.....


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.