애플리케이션 개발을 하다 보면 수많은 에러를 맞닥뜨리게 됩니다. 이 때, 어떤 에러가 어디에서 발생했는지 알아보기 위해 로그캣에 표시되는 Stack trace 정보를 참고하곤 합니다.
보통, 아래와 유사한 형태의 Stack trace가 표시됩니다.
E/fb4a(:dash):UDPPrimingServiceHandler﹕ Unable to resolve host "graph.facebook.com": No address associated with hostname
java.net.UnknownHostException: Unable to resolve host "graph.facebook.com": No address associated with hostname
at java.net.InetAddress.lookupHostByName(InetAddress.java:440)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:250)
at com.facebook.http.common.FbHttpRequestProcessor.a(FbHttpRequestProcessor.java:473)
at com.facebook.http.common.FbHttpRequestProcessor.c(FbHttpRequestProcessor.java:402)
at com.facebook.http.common.FbHttpRequestProcessor.b(FbHttpRequestProcessor.java:362)
at com.facebook.http.common.FbHttpRequestProcessor.a(FbHttpRequestProcessor.java:349)
at com.facebook.http.common.FbHttpRequestProcessor.a(FbHttpRequestProcessor.java:279)
at com.facebook.http.common.FbHttpRequestProcessor.a(FbHttpRequestProcessor.java:1277)
at com.facebook.http.common.FbHttpRequestProcessor$Dispatcher.run(FbHttpRequestProcessor.java:1298)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at com.facebook.common.executors.WrappingExecutorService$1.run(WrappingExecutorService.java:77)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at com.facebook.common.executors.DefaultConstrainedListeningExecutorService$Worker.run(DefaultConstrainedListeningExecutorService.java:327)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at com.facebook.common.executors.NamedThreadFactory$1.run(NamedThreadFactory.java:42)
at java.lang.Thread.run(Thread.java:818)
그런데, 흔하진 않지만 간혹 위와 같은 Stack trace도 없이 애플리케이션만 죽어버리는 경우가 있습니다. 이는 주로 애플리케이션을 강제 종료하게 된 부분이 다른 쓰레드에서 실행되었을 때 발생하는데, 이와 같이 다른 쓰레드에서 발생한 에러에 대한 Stack trace를 강제로 출력하도록 하면 원인을 분석하는 데 큰 도움이 됩니다.
아래 코드를 애플리케이션 클래스 혹은 메인 액티비티의 onCreate() 에 추가하면 다른 쓰레드에서 발생하는 오류의 Stack trace를 출력할 수 있습니다.
try { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { ex.printStackTrace(); } }); } catch (SecurityException e) { e.printStackTrace(); }
p.s. 제 경우는 RxJava를 사용하면서 에러가 발생했는데 onError() 를 추가하지 않아서 발생하고 있던 문제였습니다. :(
혹시 RxJava를 사용하시는 분들은 에러가 발생할 여지가 있는지 꼭 확인하시길...
W/System.err﹕ java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
W/System.err﹕ at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:60)
W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err﹕ at android.os.Looper.loop(Looper.java:148)
W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
'안드로이드 개발 팁' 카테고리의 다른 글
앱 실행시 jacoco agent에서 NoClassDefFoundError가 발생한다면? (0) | 2016.04.02 |
---|---|
뷰에 표시되는 내용을 캡쳐하려면? (30) | 2011.01.24 |