2015-07-31 7 views
11

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

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

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

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

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

+0

это не вся stacktrace –

+2

попробуйте 'adb logcat' в командной строке, чтобы просмотреть весь журнал с вашего устройства. иногда IDE не показывает все журналы по какой-то причине .., которые могли бы помочь выявить проблему –

+0

@Marcin Orlowski Что заставляет вас думать, что это не весь стек? Единственным другим контентом в трассировке стека является несколько других потоков, все из которых показаны как все еще запущенные. – user316117

ответ

10

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

How do I prevent exception catching in Android?

которые предполагают, чтобы выполнять код, пока вы не получите данные в вашем LogCat, которая относится к коду.

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

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

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

1

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

+0

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

+0

Я бегу в режиме отладки. – user316117

+0

@ Enes Battal Установить точки останова ** где **? – user316117

6

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

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

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

+0

Этот ответ слишком расплывчатый. У меня много точек останова и сообщений журнала, но они ничего не показывают. Этого не происходит, когда я делаю шаг в/шаговый (F5/F6 в Eclipse) в моем собственном коде; только когда я «бегу», потому что это происходит в какой-то другой теме. Из трассировки стека, похоже, связано с запуском деятельности, и как мне заставить ее рассказать мне, какую деятельность? – user316117

+0

Я догадываюсь, что довольно ясно, какая активность из ActivityThread.performLaunchActivity (ActivityThread $ ActivityClientRecord, Intent): 2255 Очевидно, что это ActivityClientRecord. У вас нет такой активности? –

1

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

1

Что такое кодовый блок onCreate() от ActivityClientRecord?

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

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

+0

@ user316117, у меня был такой опыт неспособности поймать исключение. Позже поймать объект Error помог мне найти причину. Определенно стоит выстрела. –

1

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

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(); 
     } 
    }); 
} 

}

1

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

  1. Increase the Log Buffer size - Иногда, слишком много вещей, которые происходят в LogCat и StackTrace вы ищете уже очищено. (Для Android Studio, it's a little different)
  2. Apply a filter using your app name - Это удаляет весь беспорядок журналов из других приложений. Если по-прежнему не повезло, вернитесь в «Нет фильтров» и перейдите к шагу 3.
  3. Поиск «Выключение» или «Выход из потока» - В сценарии сбоя основная причина отображается вокруг этих слов.
  4. Уточните проблемный код, используя точки останова. Существует много способов сделать это, но я предпочитаю установить точку останова на любом «крупном событии» (OnCreate, Service, Calls, Catch Exception и т. Д.) И пропустить все, пока не найду главное событие, которое никогда не было достигнуто, но должно быть. Затем я настраиваю точки останова немного больше каждый раз, чтобы сузить его больше.
  5. Обратите особое внимание на близлежащие темы/Runnables, поскольку они часто являются виновниками загадочных ошибок (бесконечные петли, тупик и т. Д.). Поместите точку останова в каждой строке метода run(), если вам нужно, и посмотрите, где она зависает/терпит неудачу.
Смежные вопросы