12

Вопрос по debugging, android – На первый взгляд бесполезная среда отладки для Android

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

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  int a = 1 / 0;
}

Теперь я ожидаю, что отладчик остановит поток и покажет мне номер строки оператора, в котором происходит деление на ноль. Нет, вместо этого он показывает некоторыеДругой метод внутренняя система, для которой у меня нет источника. Что еще хуже, нет сообщения об исключении.

До этого приложения я создал приложение, которое будет что-то делать при нажатии кнопки. Если возникло какое-либо исключение, снова не будет показан полезный номер строки или сообщение об исключении.

На данный момент нет никакого способа отладить мое приложение. Есть идеи?

Я использую последний SDK вместе с плагином Eclipse ADT и отлаживаю на реальном устройстве (Nexus One).

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

от SteveCav

Это сводит меня с ума. это 2010, а не 1970-е

от SteelBytes

Смотрите мой ответ вstackoverflow.com/questions/2552568/... , Причина, по которой вы видите другой метод, заключается в том, что по умолчанию Eclipse разбивается только на необработанные исключения. Ваше ArithmeticException было перехвачено платформой Android, и Eclipse не остановился, пока исключение не было переброшено. Если вы добавите точку останова исключения в перехваченных исключениях ArithmeticException, вы сломаете точку выброса. (Выполнение этого вне основного потока также должно работать, поскольку оно не будет обернуто фреймворком.)

от fadden

Я чувствую твою боль. Visual Studio и другие продвинутые IDE испортили нас. Возвращение к устаревшим файлам журналов похоже на использование printf () снова для отладки.

от Sebastian Dwornik
3 ответа
2

Затмение не отлаживает

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

Вы можете установить точки останова, что на самом деле означает отладку.

от Ryan Alford

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

от Mansour
8

Сначала я должен признать

что вы частично правы. Существуют отладчики, которые останавливают выполнение при исключении и показывают строку кода, которая его вызвала. Я хотел бы видеть это поведение в отладчике затмения. Но другие ответы верны.

Пока вы находитесь в Eclipse, зайдите в Window -> Show View -> Other -> Android -> LogCat. Теперь вы получите все выходные данные отладки, которые происходят на эмуляторе или подключенном устройстве. На вашем примере я получу следующий StackTrace.

T03-18 09:45:12.398: ERROR/AndroidRuntime(1778): Uncaught handler: thread main exiting due to uncaught exception
03-18 09:45:12.428: ERROR/AndroidRuntime(1778): java.lang.RuntimeException: Unable to start activity ComponentInfo{android.client/android.client.ClientMain}: java.lang.ArithmeticException: divide by zero
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.os.Looper.loop(Looper.java:123)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.app.ActivityThread.main(ActivityThread.java:4203)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at java.lang.reflect.Method.invokeNative(Native Method)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at java.lang.reflect.Method.invoke(Method.java:521)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at dalvik.system.NativeStart.main(Native Method)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778): Caused by: java.lang.ArithmeticException: divide by zero
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.client.ClientMain.onCreate(ClientMain.java:35)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     ... 11 more
03-18 09:45:12.438: INFO/Process(52): Sending signal. PID: 1778 SIG: 3

Если вы пойдете к самому глубокому Исключению, показанному тем, которое подняло все остальные, вы увидите

03-18 09:45:12.428: ERROR/AndroidRuntime(1778): Caused by: java.lang.ArithmeticException: divide by zero
03-18 09:45:12.428: ERROR/AndroidRuntime(1778):     at android.client.ClientMain.onCreate(ClientMain.java:35)

Это довольно ясно, я думаю. В строке 35 в ClientMain было сгенерировано исключение, и это было исключение деления на ноль. Если вы не можете понять это (в случае, который не так понятен, как в примере), вы можете установить точку останова на этой строке или точку входа метода или что-то еще. Теперь отладчик покажет вам все переменные, и вы можете пошагово выполнять код, пока не возникнет ошибка. Если вы наведите курсор мыши на переменную, вы увидите значение этой переменной, и теперь вы можете шаг за шагом попытаться понять причину исключения и устранить его. Если вы углубитесь в код, то окажетесь в классе java, отвечающем за деление, если вы не добавили в свой проект jar с исходным кодом этих классов, отладчик не сможет показать вам что-то в этом месте.

1

Отладка не означает

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

Чтобы обнаружить подобные проблемы, вам, как программисту, нужно будет реализовать полезные тексты журналов, используяLog класс, например, при выходе и вводе функций. Кроме того, используйте блоки исключений везде, где вы подозреваете, что что-то может пойти не так. Например, в случае деления, если делитель не является статичным, но может быть чем угодно, защитите действия, подобные делениям! В своем блоке catch зарегистрируйте обнаруженное событие или сделайте что-нибудь полезное.

По сути, это не является чем-то конкретным для Android, но общим для Java!

Я не хочу начинать спор, но из всех различных сред разработки, которые я использовал на протяжении многих лет (C, C ++, Python, Java для рабочего стола, Javascript, VB, .NET), я могу знать, где именно Произошло исключение, его детали, обратный просмотр и просмотр локальных переменных во время исключения, были центральной частью процесса отладки. Отладка, конечно, не просто, но ясно, что это недостаток отладки приложений для Android.

от Mansour

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

от John Giotta

Похожие вопросы