Android-로그에 전체 예외 역 추적 인쇄


94

예외를 발생시키는 try / catch 블록이 있는데 Android 장치 로그에서 예외에 대한 정보를보고 싶습니다.

내 개발 컴퓨터에서이 명령을 사용하여 모바일 장치의 로그를 읽었습니다.

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

나는 이것을 먼저 시도했다.

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

그러나 그것은 로그에 아무것도 인쇄하지 않습니다. 그것은 많은 도움이되었을 것이기 때문에 유감입니다.

내가 달성 한 최고는 :

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

아무것도 아닌 것보다 낫지 만 그다지 만족 스럽지는 않습니다.

전체 역 추적을 로그에 인쇄하는 방법을 알고 있습니까?

감사.

답변:


165
try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

추가 정보로 더욱 명확하게

(이것은 이것에 대한 가장 오래된 질문이기 때문에.)

3 인수 Android 로그 메소드는 Exception세 번째 매개 변수로 제공되는에 대한 스택 추적을 인쇄합니다 . 예를 들면

Log.d(String tag, String msg, Throwable tr)

tr예외는 어디에 있습니까 ?

이 주석 에 따르면 이러한 Log 메서드는 "방법을 사용하여 getStackTraceString()... 배후에서"이를 수행합니다.


4
또한 내 스타일 : Log.e (e.getClass (). getName (), e.getMessage (), e);
Vikas 2011 년

27
e.getMessage () 사용에주의하십시오. 발생 된 예외 유형에 따라 getMessage ()가 널을 리턴 할 수 있습니다. 이는 로그 메소드에서 널이 메시지 매개 변수로 지원되지 않으므로 그 자체로 예외를 발생시킵니다. 참조 여기에
누구와도 바꿀 수없는 다이애나

게다가 두 번째 매개 변수에서이 예외를 발생시킨 코드의 종류를 설명하는 것이 더 합리적입니다. 어쨌든 메시지는 이미 출력에 포함되어 있습니다.
EboMike 2014 년

1
@Unique가 말하는 것은 매우 중요합니다. 이미 스택 추적을 인쇄하기 때문에 답변에서 언급 한대로 Log를 사용하는 것이 좋습니다
Buddy

1
@SignoffTeamz 문서를 읽을 수 있습니다. 로그를 쉽게 필터링하고 어떤 앱 (및 그 부분)이 메시지를 작성했는지 쉽게 확인할 수 있도록 로그를 표시하는 식별자입니다. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike

52

이 도우미 함수는 ExceptionThrowable 이기 때문에 잘 작동합니다 .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }

앱과 위치를 지정하는 데 사용되는 문자열입니다. 모든 문자열이 거기에서 할 것입니다.
조지

8
catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

아니면 ... 아시다시피 ... EboMike가 말한 것.


3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}

2

e.printStackTrace ()는 그것을 나에게 인쇄합니다. 나는 당신이 logcat을 올바르게 실행하고 있다고 생각하지 않습니다. 셸에서 실행하지 말고 실행하십시오.

/home/dan/android-sdk-linux_x86/tools/adb logcat


1

표준 출력 및 오류 출력은 기본적으로 / dev / null로 지정되므로 모두 손실됩니다. 이 출력을 기록하려면 여기에 표시된 "stdout 및 stderr보기"지침을 따라야합니다.


1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}

0

Android 컨텍스트에서 예외를 문자열로 캐스팅해야했습니다.

try {
    url = new URL(REGISTRATION_PATH);
    urlConnection = (HttpURLConnection) url.openConnection();
} catch(MalformedURLException e) {
    Log.i("MALFORMED URL", String.valueOf(e));
} catch(IOException e) {
    Log.i("IOException", String.valueOf(e));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.