안드로이드 충돌 로그를 얻는 방법은 무엇입니까?

시장에 있지 않은 (디버그 인증서로 서명 된) 앱이 있지만 응용 프로그램이 충돌 할 때마다 충돌 로그 데이터를 얻고 싶습니다. 내 앱이 중단 된 이유에 대한 로그는 어디에서 찾을 수 있습니까?



답변

다른 사람이 앱을 다운로드하고 원격 장치에서 충돌하는 경우 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