如何获取Android崩溃日志?

She*_*lam 146 crash logging android

我有一个不在市场上的应用程序(使用调试证书签名),但只要我的应用程序崩溃,我想获得崩溃日志数据.我在哪里可以找到我的应用程序崩溃原因的日志?

Chr*_*son 136

如果您的应用被其他人下载并在远程设备上崩溃,您可能需要查看Android错误报告库(在此SO帖子中引用).如果它只在您自己的本地设备上,您可以使用LogCat. 即使设备在发生崩溃时未连接到主机,连接设备和发出adb logcat命令也会下载整个logcat历史记录(至少在它的范围内)是缓冲的,通常是日志数据的一个,它只是不是无限的).这些选项中的任何一个都可以回答您的问 如果没有,你可以尝试澄清你想要的更多吗?

  • 你能详细说明如何使用adb logcat命令吗?我在/ SDK/tools目录中运行吗?有没有我应该注意的标志?等等 (2认同)
  • @ jesses.co.tt是的,只需从adb所在的目录运行`adb logcat`.或者你也可以使用Eclipse插件中包含的SDK工具 (2认同)
  • Crashlytics是我用过的最好的远程异常日志记录软件.它出现在我的所有应用程序中,检查出来. (2认同)

Tan*_*ury 45

这样做的方法是实现Thread.UncaughtExceptionHandler接口并将其传递给Thread.setDefaultUncaughtExceptionHandler()Activity的开头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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意我们让Android框架的defaultUEH来处理它.

在Activity的顶部注册一个上面类的实例,如下所示:

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

Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
...
Run Code Online (Sandbox Code Playgroud)

此处理程序将跟踪保存在文件中.当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");
Run Code Online (Sandbox Code Playgroud)

或者你也可以使用ACRA错误报告系统.只需在你的项目库中包含ACRA.jar,并在你的启动器活动类声明之前使用下面的代码片段

@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT) 
Run Code Online (Sandbox Code Playgroud)


小智 26

你可以从控制台试试这个: -

adb logcat -b崩溃

  • 非常感谢,它实时显示崩溃日志!真的很有帮助。 (2认同)

Jar*_*iuk 9

您可以使用Apphance.这是一个跨平台的服务(现在主要是Android,iOS,其他平台正在运行),允许远程调试任何移动设备(Android,iOS现在 - 其他正在开发中).它不仅仅是一个崩溃日志,实际上还有更多:记录,测试人员报告问题,崩溃日志.整合大约需要5分钟.目前,您可以申请访问封闭测试版.

免责声明:我是Polidea的首席技术官,Polidea是Apphance的合作伙伴,也是它的共同创造者.

更新:Apphance不再是封闭测试版!更新2:Apphance作为http://applause.com产品的一部分提供

  • 这不应该得到这么多的箭头它比大多数开发预算多花费10倍(每月2,500美元!) (12认同)
  • 我只是尝试了apphance并喜欢它.在将apphance lib集成到您的应用程序中时,文档错过了一个关键点; 使用最新版本的Eclipse ADT,您必须将apphance.jar放在`libs`目录中作为[this](http://stackoverflow.com/a/9916751/9648)SO回答说明.[this github commit](https://github.com/johnnylambada/WorldMap/commit/235ac0461a91a080cca2cdcb7fd2059464165406)显示了我需要对我的WorldMap应用程序进行的更改才能使用apphance. (2认同)

T. *_*kle 8

如果您正在使用Eclipse,请确保使用debug而不是运行.确保您处于调试透视图(右上角)您可能需要按几次"恢复"(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
Run Code Online (Sandbox Code Playgroud)

这个的重要部分是

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)
Run Code Online (Sandbox Code Playgroud)

那些告诉我们在onCrate方法的main.java的第13行是一个数组超出范围的例外.


Ket*_*mar 8

这是Crash Log的另一个解决方案.

Android市场有一个名为"Crash Collector"的工具

查看以下链接以获取更多信息

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

  • 不适用于Android 4.1及更高版本(读取日志的新权限). (3认同)

小智 5

如果您正在寻找基本的崩溃报告工具,请尝试crashlytics

如果您想要更高级的报告工具,请查看Gryphonet。它记录发生的所有崩溃以及导致崩溃的确切代码行以及自动标记,显示用户在崩溃前采取的步骤等。

祝你好运!


JGP*_*lip 5

这是一个可以帮助您将所有日志转储到文本文件中的解决方案

adb logcat -d > logs.txt
Run Code Online (Sandbox Code Playgroud)