본문 바로가기

안드로이드 개발 팁

Stack Trace도 남기지 않고 애플리케이션이 강제 종료될 때?

애플리케이션 개발을 하다 보면 수많은 에러를 맞닥뜨리게 됩니다. 이 때, 어떤 에러가 어디에서 발생했는지 알아보기 위해 로그캣에 표시되는 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)