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

Что не так с отладкой в ​​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 имеет значение null в дереве данных исключения ('e'), и в нем просто указывается сообщение "ArithmeticException". (что приятно, как насчет вас указать мне в направлении, где вы его нашли??)

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Вещи немного странные для Android, потому что вы работаете в среде приложения, а не в отдельном приложении. Как видно из вышеприведенной трассировки стека, исключение фактически было захвачено ActivityThread. Это означает, что ваше начальное исключение считается "пойманным" и не будет отключать обработку Eclipse break-on-uncaught до тех пор, пока ActivityThread не перебросит его. По этой причине стек, который вы видите в отладчике, когда он останавливается, нигде не находится рядом с вашим кодом.

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

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

Ответ 3

Я получаю следующую трассировку стека в 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 представит это?

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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