Что случилось с отладкой в ​​Eclipse на Android?

Возможный дубликат:
Казалось бы, бесполезная среда отладки для Android

Я, очевидно, был испорчен Visual Studio, потому что, хотя я просто изучаю Android и среду Eclipse, отладка приложений в Eclipse становится серьезным ущербом для дальнейшей разработки.

Например, Eclipse будет скомпилировать это деление на ноль просто отлично:

public class Lesson2Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); int i = 1 / 0; TextView tv = new TextView (this); tv.setText ("Hello, Android!"); setContentView (tv); } } 

И затем, когда он выполнит его под отладчиком, я получу полный экран бесполезной информации об отладке, без которой на самом деле указывает мне на конкретную строку, содержащую ошибку.

Стек trace является нулевым в дереве данных исключения («e»), и в нем просто указывается сообщение «ArithmeticException». (это приятно, как насчет того, чтобы вы указывали мне в направлении того, где вы его нашли !?)

Я посмотрел по всему экрану и сбился с толку, что эта IDE не может понять это правильно. Разрабатывает ли с Eclipse курорт все в 1991 году с помощью printf (), например, регистрируя каждый интервал, чтобы отслеживать ошибки? Шутки в сторону.

Есть ли конфигурация или плагин, который мне не хватает, чтобы помочь с этим?

Я не тестировал этот случай с XCode, но если iPhone dev. IDE обрабатывает это больше как Visual Studio, тогда неудивительно, что на рынке Android так мало приложений.

Я очень рад Android, но кажется, что Eclipse мешает.

Да, вы пропустили один из очень важных плагинов для Eclipse под названием «LogCat». Он захватывает все журналы отладки, которые предоставляет ваша программа для Android, независимо от того, работает ли она на эмуляторе или на реальном телефоне. Последнее, очевидно, требует, чтобы телефон был подключен к компьютеру, и менее – очевидно, что настройка в приложении -> Разработка -> Включить USB-отладку включена.

Сообщения LogCat дают вам полную информацию о том, что вызвало ошибку, включая номер строки. Чтобы открыть LogCat в Eclipse, перейдите в Window -> Show View -> Other -> Android (одна из папок в списке) -> LogCat. Затем прикрепите окно LogCat где-нибудь, где вы можете легко его увидеть, и Eclipse запомнит это местоположение и откроет его снова в следующий раз, когда вы начнете его.

(Иногда LogCat и эмулятор отсоединяются друг от друга. Простой способ исправить это просто закрыть Eclipse и эмулятор, а затем перезапустить их оба.)

(В комментарии слишком много, поэтому я пишу это как ответ.)

Вы можете настроить Eclipse, чтобы остановить исключения, которые были пойманы, неотобраны или и то, и другое. По умолчанию Eclipse будет разбиваться на любое неперехваченное исключение и будет игнорировать все обнаруженные исключения (т.е. все, что зацепило блок try / catch).

Для Android это немного странно, потому что вы работаете в среде приложения, а не в автономном приложении. Как видно из вышеприведенной трассировки стека, исключение фактически было захвачено ActivityThread. Это означает, что ваше начальное исключение считается «пойманным» и не будет отключать обработку Eclipse без перехвата до тех пор, пока ActivityThread не перебросит его. По этой причине стек, который вы видите в отладчике при его остановке, нигде не находится рядом с вашим кодом.

Поскольку вы знаете, что получаете исключение ArithmeticException, вы можете заставить его сломать «пойманные» экземпляры этого исключения, и он остановится в точке броска. (Не заставляйте его ломать все пойманные исключения – вы будете бесконечно «возобновлять»).

Поскольку журнал регистрации «задерживается», если отладчик позволяет программе продолжать выполнение до тех пор, пока не произойдет ведение журнала, вы не сможете отлаживать в точке броска.

Я получаю следующую трассировку стека в logcat:

 03-31 17:01:11.272: ERROR/AndroidRuntime(205): java.lang.RuntimeException: Unable to start activity ComponentInfo{MyClass}: java.lang.ArithmeticException: divide by zero 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.access$2100(ActivityThread.java:116) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.os.Handler.dispatchMessage(Handler.java:99) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.os.Looper.loop(Looper.java:123) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.main(ActivityThread.java:4203) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at java.lang.reflect.Method.invokeNative(Native Method) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at java.lang.reflect.Method.invoke(Method.java:521) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at dalvik.system.NativeStart.main(Native Method) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): Caused by: java.lang.ArithmeticException: divide by zero 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at MyClass.onCreate(MyClass.java:40) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): ... 11 more 

Это кристально ясно. Посмотрите на вызывающее исключение в строке 14 трассировки стека, и он говорит: Деление на ноль. Это то, что вы сделали неправильно. В следующей строке говорится: at MyClass.onCreate (MyClass.java:40) Это будет строка, в которой возникает исключение. Я не понимаю, что будет сложно или бесполезно. Как VS представит это?

В течение нескольких недель после запуска разработки Android я был разочарован отсутствием информации, которую я нашел в окне LogCat. Я бы поместил сообщения журнала в свое приложение и никогда их не видел, и я знал, что мое приложение бросает исключения, но я никогда не видел их.

Наконец, однажды я понял: в окне LogCat отображается неправильное устройство. У меня обычно есть два или три Android-устройства, подключенные к моему компьютеру в любой момент времени, и LogCat показывает одно из этих других устройств. Чтобы изменить это, вы должны отобразить окно «Устройства» и выбрать нужное устройство в этом окне.

Я считаю, что это пример смехотворно плохой пользовательский интерфейс. Здесь я смотрю окно LogCat, и нигде в этом окне нет никаких указаний относительно того, какие журналы журнала я просматриваю. Я должен знать достаточно, чтобы открыть совершенно другое окно и выбрать там устройство. Я буквально потратил несколько недель, прежде чем я понял это. Вы могли бы подумать, что LogCat по умолчанию будет использовать все устройства или, по крайней мере, автоматически переключиться на устройство, которое вы недавно запустили, но это не так. Если вы стучите головой о стол, задаваясь вопросом, почему LogCat так бесполезен, возможно, именно поэтому.

У вас типичная проблема разработки с использованием физического устройства, а не части программного обеспечения на машине.

Он укажет вам на конкретную ошибку (опубликуйте информацию, и мы покажем вам). Просто найдите имена пакетов в ошибке, где будет показано, где было выбрано исключение.

Вы также должны использовать точки останова, чтобы пройти процесс и посмотреть, что произойдет, отладчик DDMS должен удовлетворять всем вашим требованиям.

И да, вы должны использовать logging Log.i (TAG, «Info:» + x);

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

  • Как исправить «Точка останова в настоящее время не будет удалена. Для этого документа не были загружены символы. "Предупреждение?
  • Действительный профиль подготовки для этого исполняемого файла не найден для режима отладки
  • Каков наилучший способ сбрасывать все объекты в журнал на C #?
  • Просмотр массива в отладчике Visual Studio?
  • Eclipse - невозможно установить точку останова из-за отсутствия атрибутов номера строки
  • Какова цель файла vshost.exe?
  • Как создать сертификат для моего Android Market APK?
  • Синий экран при использовании Ping
  • Программа и отладчик завершают работу без указания проблемы
  • Критику моего неинтрузивного отладчика кучи
  • Есть ли разница в производительности между Javac debug on и off?
  • Давайте будем гением компьютера.