В eclipse у меня есть опция, установленная на точку останова при любом исключении, так что я могу отлаживать состояние приложения при вызове исключения.
В этом первом примере все работает отлично. Он показывает полный стек вызовов, и я могу щелкнуть любой уровень стека вызовов и увидеть локальные переменные во время сбоя.
Однако, если я удаляю исключения из других частей моего кода (что-либо в потоке пользовательского интерфейса или в моем потоке GLSurfaceView, похоже,), я получаю совершенно бесполезное поведение. После закрытия силы я вижу исключение в logcat:
05-30 20:18:10.905: E/AndroidRuntime(23982): FATAL EXCEPTION: GLThread 13
05-30 20:18:10.905: E/AndroidRuntime(23982): java.lang.NullPointerException
05-30 20:18:10.905: E/AndroidRuntime(23982): at x.x.x.Graphics.MyRenderer.drawSubRenderable(MyRenderer.java:237)
05-30 20:18:10.905: E/AndroidRuntime(23982): at x.x.x.Graphics.MyRenderer.onDrawFrame(MyRenderer.java:181)
05-30 20:18:10.905: E/AndroidRuntime(23982): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363)
05-30 20:18:10.905: E/AndroidRuntime(23982): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
но я не могу остановить приложение во время сбоя. Приложение останавливается, но я получаю только это (я не вижу свой код в стеке вызовов):
Наконец, если я создаю исключение в потоке пользовательского интерфейса, я получаю этот монстр, но снова мой код, который бросил исключение, нигде не видно:
Почему я не могу получить код в точке останова на моем фактическом коде во всех случаях, чтобы я мог проверить, почему возникает исключение? Почему это работает в некоторых случаях, а не в других? Помогло бы это, если бы я установил источник Android? (В настоящее время просто получаю сообщение "источник не найден", когда получаю исключения)
Поэтому я сделал немного больше исследований, и я думаю, что могу догадаться, что происходит.
В настоящее время я только перехватываю исключаемые исключения, и я предполагаю, что любые исключения, возникающие внутри обратного вызова android, обрабатываются и обновляются, тем самым удаляя мой источник из активной трассировки стека.
Если я поймаю все пойманные исключения, чем во всех случаях, я нахожу свой код в стеке вызовов, как хотелось.
К сожалению, если я поймаю все пойманные исключения, я разорву, вероятно, более 100 исключений, сгенерированных и обработанных внутри системы андроида, что делает ломающиеся на пойманных исключениях несколько бесполезными.
Пожелайте, чтобы здесь было лучшее решение, ответьте, если вы знаете что-нибудь!