Подтвердить что ты не робот

Хорошая стратегия для отладки этого?

Приложение Android (4.2.2), разработанное в Java на Eclipse, я получаю сбой, но я не могу понять, что в моем коде вызывает его.,

Трассировка стека не ссылается ни на мой собственный исходный код.,

Тема [< 1 > main] (Приостановлено (исключение RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread $ActivityClientRecord, Intent): 2255
  ActivityThread.handleLaunchActivity(ActivityThread $ActivityClientRecord, Intent): 2309 ActivityThread.access $700 (ActivityThread, ActivityThread $ActivityClientRecord, Intent): 157
  ActivityThread $H.handleMessage(Message) line: 1289
  ActivityThread $H (обработчик).dispatchMessage(Message): 99   Looper.loop(): 176 ActivityThread.main(String []) строка: 5317
  Method.invokeNative(Object, Object [], Class, Class [], Class, int, boolean): недоступно [native method] Method.invoke(Object, Object...): 511 ZygoteInit $МетодAndArgsCaller.run(): 1102 ZygoteInit.main(строка []): 869   NativeStart.main(строка []) строка: недоступна [собственный метод]

... Я запускаю несколько действий в своем приложении, и все они завернуты в try/catch, но если я установил точки останова в блоках catch, они не будут удалены, и если я перешагнув код, запускающий Действия ничего не кажутся неправильными. Также система ничего не записывает в Logcat, указывающую на какие-либо исключения (никаких фильтров на Logcat, полный вывод Verbose).

Нажатие на приведенные выше строки просто дает мне "источник не найден". Есть ли способ увидеть, какую активность он пытается запустить или какова природа исключения?

4b9b3361

Ответ 1

После изучения этого я увидел ответ на этот вопрос здесь:

Как предотвратить захват исключений в Android?

Что предлагает продолжать выполнять код, пока вы не получите информацию в своем логарифме, который относится к вашему коду.

Только примечание об использовании подробных и т.д.
Кроме того, я лично просто сосредотачиваюсь на ошибках, когда начинаю отлаживать. Мне легче читать. Я удаляю все ошибки из logcat, прежде чем я начну смотреть на предупреждения. Также с подробным, если программа действительно не работает хорошо, логарифм может не справиться.

Это мой личный стиль отладки, это отнюдь не закон.

Удачи вам в этом.

Ответ 2

Прежде всего - try/catch - это не лучший способ получить приложение, защищенное от пули. Как правило, большое количество таких блоков означает, что автор маскирует ошибки.

То, что вы, вероятно, сделали, это передать некоторые неправильные аргументы в какой-либо системный метод или просто у вас есть определенная ошибка конкретной платформы. Я не могу сказать, что это за метод, основанный только на вашем logcat.

Как найти ошибку? Вероятно, самый эффективный способ - это просто установить некоторые лог-сообщения/точки останова и отладить его по очереди, пока вы снова получите эту ошибку. Затем вернитесь сюда с подробной информацией, если это необходимо.

Ответ 3

Попробуйте запустить отладчик IDE в режиме отладки. Как правило, вы поймете свое исключение. Возможно, вам придется щелкнуть по различным потокам, чтобы увидеть, что происходит с каждым.

Ответ 4

Вы уверены, что версия 4.2.2 верна? Код AOSP для ActivityThread.java не показывает ничего, кроме комментариев в строке 2255 для всех тегов 4.2.2. Без каких-либо других действий, если бы я был в этой ситуации, я бы погрузился в код AOSP, чтобы узнать, дает ли он какие-либо сведения о том, где все происходит неправильно.

Ответ 5

Каков кодовый блок onCreate() из ActivityClientRecord?

  • Вы должны установить несколько точек останова. Сначала в месте вызова startActivity(), затем на целевую активность onCreate() первого оператора. Затем вы должны обратиться к заявлению, чтобы узнать точную причину.

Если вы все еще не можете найти проблемную точку, то поймите Error, а не Exception, заверните startActivity(), а затем сообщите нам, если вы сможете увидеть что-нибудь полезное.

Ответ 6

Попробуйте добавить в свой класс приложения следующий код:

public class App extends Application {

@Override
public void onCreate() {
    super.onCreate();
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            ex.printStackTrace();
        }
    });
}

}

Ответ 7

По моему опыту, я столкнулся с аналогичными проблемами в поиске кода, вызывающего крах. Здесь вообще то, что я делаю в таких случаях:

  • Увеличьте размер буфера журнала - Иногда в Logcat происходит слишком много вещей, и уже найденная стек, который вы ищете, уже очищен. (Для Android Studio это немного отличается)
  • Применить фильтр, используя имя вашего приложения - Это устраняет все беспорядок журналов из других приложений. Если вам еще не повезло, вернитесь к "Нет фильтров" и перейдите к шагу 3.
  • Поиск "Выключение" или "Выход из потока". В сценарии сбоя основная причина отображается вокруг этих слов.
  • Уточните проблемный код, используя точки останова. Там много способов сделать это, но я предпочитаю устанавливать точку останова на любом "крупном событии" (OnCreate, Service, Calls, Catch Exception и т.д.) И пробегать каждый, пока не нахожу главное событие, которое никогда не достигалось, но должно быть. Затем я настраиваю точки останова немного больше каждый раз, чтобы сузить его больше.
  • Придайте дополнительное внимание соседним Threads/Runnables, так как они часто являются виновниками загадочных ошибок (бесконечные петли, тупик и т.д.). Поместите точку останова в каждой строке метода run(), если вам нужно, и посмотрите, где она зависает/терпит неудачу.