首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取Android系统的崩溃日志?

如何获取Android系统的崩溃日志?
EN

Stack Overflow用户
提问于 2010-09-05 02:02:24
回答 16查看 364.9K关注 0票数 171

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

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2010-09-05 02:24:24

如果你的应用程序被其他人下载并在远程设备上崩溃,你可能需要查看安卓错误报告库(在this SO post中引用)。如果它只在你自己的本地设备上,你可以使用LogCat.,即使在崩溃发生时设备没有连接到主机上,连接设备并发出adb logcat命令将下载整个logcat历史(至少在缓冲的程度上,它通常是大量的日志数据,只是不是无限的)。这两个选项中有哪一个能回答你的问题吗?如果没有,你能不能再多解释一下你想要什么?

票数 150
EN

Stack Overflow用户

发布于 2014-03-20 16:47:50

完成此操作的方法是实现Thread.UncaughtExceptionHandler接口,并在活动的onCreate()开始时将其传递给Thread.setDefaultUncaughtExceptionHandler()。下面是实现类TopExceptionHandler

代码语言:javascript
复制
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来处理它。

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

代码语言:javascript
复制
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

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

此处理程序将跟踪保存在文件中。当ReaderScope下次重启时,它会检测到该文件,并提示用户是否要将其通过电子邮件发送给开发人员。

要通过电子邮件发送堆栈跟踪,请执行以下代码以将其打包到电子邮件中。

代码语言:javascript
复制
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 Error Reporting System.Just,在项目库中包含ACRA.jar,并在launcher activity类声明之前使用以下代码片段

代码语言:javascript
复制
@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT) 

或者你可以从控制台尝试一下:

代码语言:javascript
复制
adb logcat -b crash 
票数 66
EN

Stack Overflow用户

发布于 2017-10-25 20:12:36

您可以在控制台中尝试:

代码语言:javascript
复制
adb logcat --buffer=crash 

有关此选项的更多信息:

代码语言:javascript
复制
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.
票数 60
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3643395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档