안드로이드 충돌 로그를 얻는 방법?


155

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

답변:


139

다른 사람이 앱을 다운로드하고 원격 장치에서 충돌하는 경우 Android 오류보고 라이브러리 ( 이 SO post 에서 참조)를 살펴볼 수 있습니다 . 장치가 자신의 로컬 장치 LogCat. 에만있는 경우 충돌이 발생했을 때 장치가 호스트 시스템에 연결되지 않은 경우에도 장치를 연결하고 adb logcat명령을 실행 하면 전체 logcat 기록을 다운로드합니다 (적어도 그 정도까지). 일반적으로 로그 데이터의 loooot 인 버퍼링되며 무한하지 않습니다). 이러한 옵션 중 하나가 귀하의 질문에 대답합니까? 그렇지 않다면 조금 더 찾고있는 것을 명확히 할 수 있습니까?


2
adb logcat 명령을 사용하는 방법을 자세히 설명 할 수 있습니까? / SDK / tools 디렉토리에서 이것을 실행합니까? 주의해야 할 플래그가 있습니까? etc.
jesses.co.tt

2
@ jesses.co.tt 예, adb logcatadb가있는 디렉토리에서 실행하십시오 . 또는 Eclipse 플러그인에 포함 된 SDK 도구를 사용할 수도 있습니다
Chris Thompson

2
Crashlytics는 내가 사용해 본 최고의 원격 예외 로깅 소프트웨어입니다. 내 모든 앱에서 사라집니다. 확인하십시오.
Jacksonkr

adb.exe는에 있습니다 $SDK_DIR/platform-tools/. 오류를 표시하려면 :.\adb.exe logcat -v time *:E
Harun

53

이를 수행하는 방법은 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 

defaultUEH.uncaughtException (t, e); uncaughtException () 메소드를 무한정 호출합니까?
Mickael Bergeron Néron

@ MickaelBergeronNéron 아니오-동일한 Throwable을 최상위 레벨 핸들러로 전송합니다.
formatBCE


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.

9

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 번째 줄에서 범위를 벗어난 배열이라고 알려줍니다.


9

Apphance를 사용할 수 있습니다. 이것은 크로스 플랫폼 서비스 (현재는 Android, iOS 및 기타 플랫폼을 지원하는 iOS)로 모든 모바일 장치 (Android, iOS-개발중인 다른 기기)를 원격으로 디버깅 할 수 있습니다. 로깅, 테스터에 의한 문제보고, 크래시 로그 등 실제로는 크래시 로그 그 이상입니다. 통합하는 데 약 5 분이 걸립니다. 현재 비공개 베타에 대한 액세스를 요청할 수 있습니다.

면책 조항 : 저는 Apphance 및 공동 제작자 인 Polidea의 CTO입니다.

업데이트 : Apphance가 더 이상 비공개 베타 버전이 아닙니다! 업데이트 2 : Apphance는 http://applause.com 오퍼링의 일부로 제공됩니다


2
나는 방금 apphance를 시도하고 그것을 좋아했다. appcance lib를 앱에 통합 할 때 문서에서 핵심 요점을 놓쳤습니다. 최신 버전의 Eclipse ADT에서는 SO 답변이 설명하는 libs것처럼 apphance.jar을 디렉토리에 두어야 합니다. 이 github 커밋 은 Apphance를 사용하기 위해 WorldMap 앱에 필요한 변경 사항을 보여줍니다.
JohnnyLambada

@HohnnyLambada 귀하의 의견에 감사드립니다. 이를 명확하게하기 위해 설명서를 업데이트했습니다.
Piotr Duda

12
이것은 대부분의 개발 예산 (월 2,500 달러)보다 10 배나 많은 위쪽 화살표가
없어야합니다

이 의견의 날짜에 apphance는 404입니다.
DaveP

옳은. uTest는 이미 오래 전부터 많은 노력을 기울여 왔으며, ApTestance의 기능을 포함하여 전체 오퍼링을 Applause로 리 브랜딩했습니다. 이제 applause.com
Jarek Potiuk


4

당신은에서 ACRA를 사용할 수 있습니다 . 이 라이브러리를 프로젝트에 포함하고 구성하면 충돌 보고서를 (이메일 또는 gdocs로)받을 수 있습니다. 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다.


4

기본 충돌보고 도구를 찾고 있다면 crashlytics를 시도 하십시오 .

고급보고 도구가 필요한 경우 Checkout Gryphonet . 충돌이 발생한 정확한 코드 줄과 함께 충돌을 일으킨 사용자와 충돌 전에 수행 한 단계 등을 보여주는 자동 마커와 함께 발생한 모든 충돌을 기록합니다.

행운을 빕니다!



2

모든 문제를 해결하기 위해이 라이브러리를 만들었습니다. Crash Reporter는 모든 충돌을 캡처하고 장치에 로컬로 기록하는 편리한 도구입니다

이 의존성을 추가하면 좋습니다.

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

장치의 모든 충돌을 로컬에서 찾아서 편리하게 수정하십시오. 충돌은 추적하기 쉬운 날짜 및 시간 형식을 사용하여 저장됩니다. 또한 아래 방법을 사용하여 기록 된 예외를 캡처하기위한 API를 제공합니다.

CrashRepoter.logException(Exception e)

장치의 충돌 로그를 얻는 데 사용한 Java 클래스는 무엇입니까?
Xenolion

Thread.UncaughtExceptionHandler 인터페이스는 처리되지 않은 모든 충돌을 캡처하는 데 사용됩니다. 다음은 동일한 github.com/MindorksOpenSource/CrashReporter/blob/master/…에 대한 구현입니다 .
발리

그래, lemme 확인이 ...! 감사합니다
Xenolion

2

다음은 모든 로그를 텍스트 파일로 덤프하는 데 도움이되는 솔루션입니다.

adb logcat -d > logs.txt


0

휴대 전화가 컴퓨터에 연결된 상태에서 충돌 로그 만 찾으려면 Eclipse에서 DDMS보기를 사용하고 디버깅하는 동안 앱이 충돌하면 DDMS 내의 LogCat에 보고서가 바로 있습니다.


0

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


0

POST를 기반 으로이 클래스를 "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));

.....


-1

안드로이드에서 Carsh log 앱을 사용해보십시오.

링크 를 사용하여 앱을 다운로드하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.