2010-10-12 2 views
9

У меня проблемы с использованием автономного java-отладчика с приложениями для Android на эмуляторе. Очевидно, любой удаленный java-отладчик, такой как jdb (или jswat), можно было бы использовать, выполнив следующие шаги (как я понимаю, после прочтения здесь и там):отладка приложения для Android с помощью «jdb -attach» (или jswat)

1) включите эмулятор, установите приложение на эмулятор (ADB установка)

2) поворот на сервере Dalvik (DDMS)

3) на эмуляторе, запустите "Devtools" приложение -> "Параметры развития" -> выберите приложение, которое вы хотите отлаживать, включить флаг «Ожидание отладчика»

4) снова в эмуляторе запустите приложение; он будет блокироваться, ожидая отладчика, и dalvik покажет новый процесс, отмеченный «красной ошибкой».

5) на dalvik выберите процесс с красным флажком; его порт отладки, таким образом, перенаправляется на localhost: 8700

6) подключите отладчик к локальному хосту: 8700. С jdb вам нужно запустить «jdb -attach 8700»

Как только отладчик запущен, ваше приложение на эмуляторе разблокируется. Таким образом, кажется, что приложение правильно обнаружило отладчик и, таким образом, работает бесплатно.

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

Следующие советы от 1, я попытался поставить циклы ожидания в начале моего приложения, в надежде, что у меня будет время установить точку останова. Когда я пытаюсь установить точку останова, jdb говорит: «Отменить точку останова XXX.YYY. Она будет установлена ​​после загрузки класса». Поскольку приложение еще не запущено. Но, если я затем выдаю команду «запустить», ответ будет «Ничего приостановлен», поскольку приложение уже работает (и это действительно так).

С jswat вы не видите Al эти сообщения, но конечный результат один и тот же :-(

Излишне говорить, что «JDB -Прикрепите» прекрасно работает с не андроид Java приложений, работающих на локальном хосте.

Любые подсказки (кроме «пожалуйста, используйте затмение»)?

я просто не хватает глупой детали в любом месте?

приложение представляет собой HelloWorld, встроенная команда «муравей отладки».

Спасибо заранее.

+0

Работает как с физическими, так и с виртуальными устройствами: https://asantoso.wordpress.com/2009/09/26/using-jdb-with-adb-to-debugging-of-android-app-on-a-real -device / –

ответ

4

Лучше всего установить точку останова в файле .jdbrc, поскольку они загружаются и откладываются, и вам не нужно менять свой код, чтобы установить произвольные циклы задержки, пытаясь поймать отладчик во время ожидания. Я, как и вы, обнаружил, что он не работает, если вы устанавливаете точки останова на имя класса. Он говорит, что отложить до загрузки класса, но тогда кажется, что jdb никогда не получает уведомление, когда класс загружен.

Однако работает если установить точку останова на конкретный класс и номер строки

в вашем.jdbrc file:

 
stop in com.android.helloandroid.HelloAndroid 
stop at com.android.helloandroid.HelloAndroid:21 

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

 
Initializing jdb ... 
*** Reading commands from /home/codeboy2k/.jdbrc 
Deferring breakpoint com.android.helloandroid.HelloAndroid. 
It will be set after the class is loaded. 
> Deferring breakpoint com.android.helloandroid.HelloAndroid:21. 
It will be set after the class is loaded. 
> > Set deferred breakpoint com.android.helloandroid.HelloAndroid:21 

Breakpoint hit: "thread= main", com.android.helloandroid.HelloAndroid.onCreate(), line=21 bci=11 

main[1] 

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

0

Да, это работает :-) Большое спасибо, codeboy2k!

Я также провел больше экспериментов, и кажется, что он также работает, если вы укажете имя метода (например, «stop in com.android.helloandroid.HelloAndroid.onCreate»). Ключевой трюк, таким образом, заключается в том, чтобы поместить начальную точку останова в файл запуска jdb, чтобы приложение блокировалось в этой точке останова, а затем продолжилось с фактическим сеансом отладки.

Я также пробовал с jswat, и правильная процедура такова: загрузите исходный код, настройте свои контрольные точки (по крайней мере, на начальном этапе), затем присоедините отладчик к приложению (это ожидалось пока отладчик). С этого момента приложение будет переходить от одной точки останова к другой. Жаль, однако, что jswat не показывает этот прогресс на самом исходном коде :-(

0

Также ищите параметр suspend = y JDWP в командной строке при запуске dalvik ... Примечание: У меня есть не проверял это, хотя dalvik имеет возможность приостанавливать загрузку с правильными параметрами командной строки.

0

Одна вещь, которую я заметил на моей настройке без затмения, заключается в том, что если у меня все еще работает ADV, я могу получить сеанс отладки (порт 8700), но я не могу получить точки останова, которые будут удалены ... закройте ADV, и он работает. Я понятия не имею, почему, но это работает для меня.

Here - это моя настройка на случай, если это поможет. м теперь по версии 17, но r, чем та же самая настройка.

Смежные вопросы