시장에 있지 않은 (디버그 인증서로 서명 된) 앱이 있지만 응용 프로그램이 충돌 할 때마다 충돌 로그 데이터를 얻고 싶습니다. 내 앱이 중단 된 이유에 대한 로그는 어디에서 찾을 수 있습니까?
답변
다른 사람이 앱을 다운로드하고 원격 장치에서 충돌하는 경우 Android 오류보고 라이브러리 ( 이 SO post 에서 참조)를 살펴볼 수 있습니다 . 장치가 자신의 로컬 장치 LogCat.
에만있는 경우 충돌이 발생했을 때 장치가 호스트 시스템에 연결되지 않은 경우에도 장치를 연결하고 adb logcat
명령을 실행 하면 전체 logcat 기록을 다운로드합니다 (적어도 그 정도까지). 일반적으로 로그 데이터의 loooot 인 버퍼링되며 무한하지 않습니다.
답변
이를 수행하는 방법은 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);
}
}
참고 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을 사용할 수도 있습니다. 프로젝트 라이브러리에 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
답변
콘솔에서이 작업을 시도 할 수 있습니다.
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.
답변
Eclipse를 사용하는 경우 디버그를 사용하고 실행하지 않아야합니다. 디버그 퍼스펙티브에 있는지 확인하십시오 (오른쪽 상단) 로그를 인쇄하려면 ‘다시 시작'(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 번째 줄에서 범위를 벗어난 배열이라고 알려줍니다.
답변
Apphance를 사용할 수 있습니다. 이것은 크로스 플랫폼 서비스 (현재는 Android, iOS 및 기타 플랫폼을 지원하는 iOS)로 모든 모바일 장치 (Android, iOS-개발중인 다른 기기)를 원격으로 디버깅 할 수 있습니다. 로깅, 테스터에 의한 문제보고, 크래시 로그 등 실제로는 크래시 로그 그 이상입니다. 통합하는 데 약 5 분이 걸립니다. 현재 비공개 베타에 대한 액세스를 요청할 수 있습니다.
면책 조항 : 저는 Apphance 및 공동 제작자 인 Polidea의 CTO입니다.
업데이트 : Apphance가 더 이상 비공개 베타 버전이 아닙니다! 업데이트 2 : Apphance는 http://applause.com 오퍼링의 일부로 제공됩니다
답변
충돌 로그에 대한 또 다른 솔루션이 있습니다.
Android 마켓에는 “Crash Collector”라는 도구가 있습니다
자세한 내용은 다음 링크를 확인하십시오
http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html