如何获取安卓系统的崩溃日志?

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

394482 次浏览

如果您的应用程序被其他人下载并在远程设备上崩溃,那么您可能需要查看 Android 错误报告库(在 这个职位中引用)。如果它只是在你自己的本地设备上,你可以使用 LogCat.即使设备在崩溃发生时没有连接到主机,连接设备并发出 adb logcat命令将下载整个 logcat 历史记录(至少在它被缓冲的程度上,这通常是一个日志数据的循环,它只是不是无限的)。这两个选项中的任何一个回答了你的问题吗?如果不能,你可以尝试澄清什么,你正在寻找多一点?

如果您正在使用 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

这个故事的重点是

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行,它是一个数组越界异常。

你可以利用阿凡斯。这是一个跨平台的服务(现在主要是 Android,iOS 和其他正在开发中的平台) ,允许远程调试任何移动设备(Android,iOS 现在-其他正在开发中)。它不仅仅是一个崩溃日志,实际上它更多: 日志、测试人员报告问题、崩溃日志。整合大约需要5分钟。目前,您可以要求访问封闭测试版。

免责声明: 我是 Polidea 的首席技术官 Apphance 背后的一家公司,也是它的创始人之一。

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

这里是另一个解决撞击日志的方案。

Android 市场上有一款名为“ Crash Collector”的工具

以下连结载有更多资料

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

您可以从 这个使用 ACRA。将这个库包含到您的项目中并对其进行配置,您可以收到(通过电子邮件或 gdocs)他们的崩溃报告。对不起,我的英语不好。

如果你只是在手机连接到计算机时查找崩溃日志,那么在 Eclipse 中使用 DDMS 视图,当你的应用程序在调试时崩溃时,报告就在 LogCat 的 DDMS 中。

也可以使用库 碰撞捕捉器

使用阿克拉崩溃报告为安卓应用程序. . 阿克拉自由党

这样做的方法是实现 Thread.UncaughtExceptionHandler接口,并在活动的 onCreate()的开头将其传递给 Thread.setDefaultUncaughtExceptionHandler()。下面是实现类 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

这是 http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html台的节目

你可以使用 adb:

adb logcat AndroidRuntime:E *:S

如果您正在寻找一个基本的崩溃报告工具,尝试 Crashlytics

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

祝你好运!

试试 Android 上的 Carsh 日志应用程序。

使用 链接下载应用程序。

我创建这个图书馆是为了解决你所有的问题。 CrashReporter 是一个方便的工具,可以捕获所有崩溃并将它们本地记录到设备中

只要添加这个依赖项,就可以开始了。

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

在本地查找设备中的所有崩溃并在方便的时候修复它们。 崩溃保存使用日期和时间格式容易跟踪。另外,它还提供了用于使用以下方法捕获日志异常的 API。

CrashRepoter.logException(Exception e)

您可以在控制台上尝试这样做:

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.

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

adb logcat -d > logs.txt

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

根据这个 职位 ,使用这个类替换“ 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));

.....