Отладка Android-приложения с помощью "jdb -attach" (или jswat) - PullRequest
9 голосов
/ 12 октября 2010

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

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

2) включить сервер dalvik (ddms)

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

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

5) на dalvik выберите процесс, отмеченный красным; его порт отладки, таким образом, перенаправляется на локальный хост: 8700

6) подключить отладчик к localhost: 8700. С jdb вы должны запустить "jdb -attach 8700"

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

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

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

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

Само собой разумеется, "jdb -attach" прекрасно работает с не-андроидными java-приложениями, работающими на localhost.

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

Я просто где-то упускаю глупую деталь?

Приложение - HelloWorld, команда сборки - "ant debug".

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 16 октября 2010

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

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

в вашем файле .jdbrc:

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 голосов
/ 09 мая 2013

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

Здесь - это мои настройки на случай, если это поможет.Я сейчас на версии 17, но кроме этого его же настройки.

0 голосов
/ 13 октября 2011

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

0 голосов
/ 18 октября 2010

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

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

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

...