我有一个不在市场上的应用程序(用调试证书签名),但希望在我的应用程序崩溃时获得崩溃日志数据。我在哪里可以找到我的应用程序崩溃的原因的日志?
发布于 2010-09-05 02:24:24
如果你的应用程序被其他人下载并在远程设备上崩溃,你可能需要查看安卓错误报告库(在this SO post中引用)。如果它只在你自己的本地设备上,你可以使用LogCat.
,即使在崩溃发生时设备没有连接到主机上,连接设备并发出adb logcat
命令将下载整个logcat历史(至少在缓冲的程度上,它通常是大量的日志数据,只是不是无限的)。这两个选项中有哪一个能回答你的问题吗?如果没有,你能不能再多解释一下你想要什么?
发布于 2014-03-20 16:47:50
完成此操作的方法是实现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 Error Reporting System.Just,在项目库中包含ACRA.jar,并在launcher activity类声明之前使用以下代码片段
@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT)
或者你可以从控制台尝试一下:
adb logcat -b crash
发布于 2017-10-25 20:12:36
您可以在控制台中尝试:
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.
https://stackoverflow.com/questions/3643395
复制相似问题