На первый взгляд бесполезная среда отладки для Android - PullRequest
12 голосов
/ 17 февраля 2010

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 18 марта 2010

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

Пока вы находитесь в 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 с исходным кодом этих классов, отладчик не сможет показать что-то в этом месте.

2 голосов
/ 17 февраля 2010

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

1 голос
/ 17 февраля 2010

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

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

По сути, это не специфично для Android, а для Java!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...