ti-enxame.com

Como obter registros de falhas do Android?

Eu tenho um aplicativo que não está no mercado (assinado com um certificado de depuração), mas gostaria de obter dados de registro de falha, sempre que meu aplicativo falha. Onde posso encontrar um log de porque meu aplicativo falhou?

136
Sheehan Alam

Se o seu aplicativo está sendo baixado por outras pessoas e travando em dispositivos remotos, você pode querer olhar para uma biblioteca de relatórios de erros do Android (referenciada em this SO post ). Se for apenas em seu próprio dispositivo local, você poderá usar LogCat. Mesmo se o dispositivo não estiver conectado a uma máquina host quando a falha ocorreu, conectar o dispositivo e emitir um comando adb logcat fará o download de todo o histórico do logcat (pelo menos na extensão que é armazenado em buffer, que normalmente é um loooot de dados de log, simplesmente não é infinito). Alguma dessas opções responde à sua pergunta? Se não, você pode tentar esclarecer o que está procurando um pouco mais?

128
Chris Thompson

A maneira de fazer isso é implementar a interface Thread.UncaughtExceptionHandler e passá-la para Thread.setDefaultUncaughtExceptionHandler() no início da onCreate() da sua Activity. Aqui está a classe de implementação 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);
    }
}

Nota Permitimos que o defaultUEH da estrutura do Android o manipule.

No topo da sua atividade, registre uma instância da classe acima como esta:

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

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

Esse manipulador salva o rastreamento em um arquivo. Quando ReaderScope é reiniciado na próxima vez, ele detecta o arquivo e avisa o usuário se ele deseja enviá-lo por e-mail ao desenvolvedor.

Para enviar por e-mail o rastreamento de pilha, execute o seguinte código para compactá-lo em um e-mail. 

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 [email protected]: " + "\n" + trace + "\n";

sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
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");

Ou você também pode usar o Sistema de Relatórios de Erros do ACRA. Inclua o ACRA.jar em suas bibliotecas do projeto e use o trecho de código abaixo antes da declaração de classe de atividade do ativador.

@ReportsCrashes(formKey = "", mailTo = "[email protected];[email protected]", mode = ReportingInteractionMode.SILENT)  
40
TanvirChowdhury

Isso é de http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html

Você pode usar adb: 

adb logcat AndroidRuntime:E *:S
29
Kanwar Malik

Você pode tentar isso do console: -

adb logcat -b crash 

22
Ameer ali khan

Você pode usar o Apphance. Este é um serviço multi-plataforma (agora, principalmente Android, iOS com outras plataformas em seu caminho), que permite depurar remotamente qualquer dispositivo móvel (Android, iOS agora - outros em desenvolvimento). É muito mais do que apenas um crashlog, na verdade, é muito mais: logging, relatórios de problemas por testadores, crashlogs. Demora cerca de 5 minutos para integrar. Atualmente você pode solicitar o acesso ao beta fechado.

Isenção de responsabilidade: Sou CTO da Polidea, uma empresa por trás do Apphance e co-criadora dele.

Atualização: O Apphance não está mais fechado beta! Atualização 2: O Apphance está disponível como parte de http://applause.com offering

11
Jarek Potiuk

Aqui está outra solução para o Crash Log.

Mercado Android tem ferramenta chamada "Crash Collector"

verifique o link a seguir para mais informações

http://kpbird.blogspot.com/2011/08/Android-application-crash-logs.html

7
Ketan Parmar

Se você estiver usando o Eclipse, certifique-se de usar o debug e não executar. Verifique se você está na perspectiva de depuração (canto superior direito) Você pode ter que pressionar 'Resume' (F8) a algumas vezes para o log imprimir. O log de travamento estará na janela do Logcat na parte inferior - clique duplo para tela cheia e certifique-se de rolar para baixo. Você verá texto vermelho para erros, o traço de falha será algo como 

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

As partes importantes para este aqui são 

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)

aqueles nos dizem que era uma exceção de array out of bounds na linha 13 do main.Java no método onCrate.

7
T. Markle

Você pode usar o ACRA de this . Incluindo essa biblioteca em seus projetos e configurando-a, você pode receber (em seu email ou gdocs) seus relatórios de falhas. Desculpe pelo meu mau inglês.

4
Jesús Manzano

Se você estiver procurando por uma ferramenta básica de relatórios de falhas, tente crashlytics .

Se você quer uma ferramenta de relatórios mais avançada, Checkout Gryphonet . Ele registra todas as falhas ocorridas junto com a linha exata de código que causou a falha, juntamente com marcadores automatizados que mostram as etapas que o usuário executou antes da falha e muito mais.

Boa sorte!

4
Ariel Bell

Use repórter acidente de acra para Android app .. Acra lib

3
Mukesh Y

Aqui está uma solução que pode ajudá-lo a despejar todos os logs em um arquivo de texto

adb logcat -d > logs.txt
2
JGPhilip

Você também pode usar biblioteca crashcatcher

1
Nikolay Moskvin

Se você está apenas procurando o log de travamento enquanto seu telefone está conectado ao computador, use a exibição do DDMS no Eclipse e o relatório está bem ali no LogCat dentro do DDMS quando o aplicativo falha durante a depuração.

0
Jonathan Lin

Eu criei esta biblioteca para resolver todos os seus problemas. Crash Reporter é uma ferramenta útil para capturar todos os seus acidentes e registrá-los no dispositivo localmente

Basta adicionar essa dependência e você é bom para ir.

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

Encontre todas as suas falhas no dispositivo localmente e corrija-as quando desejar. As falhas são salvas usando o formato de data e hora, fácil de rastrear. Além disso, também fornece API para captura de exceções registradas usando o método abaixo.

CrashRepoter.logException(Exception e)
0
Bali