Java / Android- 전체 스택 추적을 인쇄하는 방법은 무엇입니까?
Android (Java)에서 전체 스택 추적을 어떻게 인쇄합니까? 내 응용 프로그램이 nullPointerException 또는 사건에서 충돌하는 경우 다음과 같이 (거의) 전체 스택 추적을 인쇄합니다.
java.io.IOException: Attempted read from closed stream.
com.android.music.sync.common.SoftSyncException: java.io.IOException: Attempted read from closed stream.
at com.android.music.sync.google.MusicSyncAdapter.getChangesFromServerAsDom(MusicSyncAdapter.java:545)
at com.android.music.sync.google.MusicSyncAdapter.fetchDataFromServer(MusicSyncAdapter.java:488)
at com.android.music.sync.common.AbstractSyncAdapter.download(AbstractSyncAdapter.java:417)
at com.android.music.sync.common.AbstractSyncAdapter.innerPerformSync(AbstractSyncAdapter.java:313)
at com.android.music.sync.common.AbstractSyncAdapter.onPerformLoggedSync(AbstractSyncAdapter.java:243)
at com.google.android.common.LoggingThreadedSyncAdapter.onPerformSync(LoggingThreadedSyncAdapter.java:33)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:164)
Caused by: java.io.IOException: Attempted read from closed stream.
at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:148)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:212)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:64)
at android.net.http.AndroidHttpClient.getUngzippedContent(AndroidHttpClient.java:218)
at com.android.music.sync.api.MusicApiClientImpl.createAndExecuteMethod(MusicApiClientImpl.java:312)
at com.android.music.sync.api.MusicApiClientImpl.getItems(MusicApiClientImpl.java:588)
at com.android.music.sync.api.MusicApiClientImpl.getTracks(MusicApiClientImpl.java:638)
at com.android.music.sync.google.MusicSyncAdapter.getChangesFromServerAsDom(MusicSyncAdapter.java:512)
... 6 more
그러나 그것은 전체적인 목적으로 코드의 위치에서 전체 스택 추적을 기록합니다. 나는 그것을 할 수 있다고 생각했다.
StackTraceElement trace = new Exception().getStackTrace();
Log.d("myapp", trace.toString());
인쇄하기 위해 모든 스택 추적 요소를 반복해야합니까? 아니면 그것을 모두 인쇄하는 간단한 방법이 있습니까?
서명으로 모든 로그 메소드 를 대체 (String tag, String msg, Throwable tr)
합니다.
세 번째 매개 변수 로 예외를 전달하면 logcat의 전체 스택 추적이 제공됩니다.
다음은 트릭을 수행해야합니다.
Log.d("myapp", Log.getStackTraceString(new Exception()));
주의 ...x more
말에 스택 추적에서 정보 차단하지
( 이 예외에 대한 나머지 스택 추적이 예외에 의해 발생하는 예외의 스택 추적 맨 아래 ( "클로 싱"예외)에서 프레임 수와 일치 함을 나타냅니다.
... 즉, 첫 번째 예외 x more
의 마지막 x
줄로 바꿉니다.
Log.getStackTraceString (Throwable t)을 사용하십시오. 더 깊이 파고 올라 더 긴 스택 추적을 얻을 수 있습니다. 예를 들면 다음과 같습니다.
try {
...
} catch(Exception e) {
Log.d("Some tag", Log.getStackTraceString(e.getCause().getCause()));
}
private static String buildStackTraceString(final StackTraceElement[] elements) {
StringBuilder sb = new StringBuilder();
if (elements != null && elements.length > 0) {
for (StackTraceElement element : elements) {
sb.append(element.toString());
}
}
return sb.toString();
}
// call this at your check point
Log.d(TAG, buildStackTraceString(Thread.currentThread().getStackTrace()));
사용할 수 있습니다 :
public static String toString(StackTraceElement[] stackTraceElements) {
if (stackTraceElements == null)
return "";
StringBuilder stringBuilder = new StringBuilder();
for (StackTraceElement element : stackTraceElements)
stringBuilder.append(element.toString()).append("\n");
return stringBuilder.toString();
}
다음과 같은 방법을 사용하여 앱 코드의 어느 시점에서나 스택 추적을 인쇄 할 수도 있습니다. Thread.dumpStack()
전체 stackTrace를 얻으려면 Throwable Object를 사용해야합니다.
try{
// code here
}catch(Exception e){
String exception = getStackTrace(e);
}
public static String getStackTrace(final Throwable throwable) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw, true);
throwable.printStackTrace(pw);
return sw.getBuffer().toString();
}
참고 : https://stackoverflow.com/a/18546861
참고 URL : https://stackoverflow.com/questions/7841232/java-android-how-to-print-out-a-full-stack-trace
'IT' 카테고리의 다른 글
스칼라에서 사용할 JSON 라이브러리는 무엇입니까? (0) | 2020.07.17 |
---|---|
jQuery는 선택이 선택되어 있는지 확인합니다. (0) | 2020.07.17 |
SMTP 서버에서 PHP로 이메일 보내기 (0) | 2020.07.17 |
현재 메소드 호출의 견적 ID (0) | 2020.07.17 |
GHCi의 여러 줄 명령 (0) | 2020.07.17 |