Android с JDB путаницы с помощью waitForDebugger - PullRequest
3 голосов
/ 24 июня 2010

Я бы хотел отладить приложение Android на моем устройстве (Nexus One - не эмулятор) с помощью командной строки.

Я запутался в том, как установить точку останова, используя jdb в сочетании с android.os.Debug.waitForDebugger.

Скажем, я поместил следующий код в основное занятие onCreate:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    android.os.Debug.waitForDebugger();
    int j = 10;
    int r = j;
}

Использование ddms Я вижу, что мое приложение ожидает отладчик (красный значок ошибки), когда я его запускаю.

Однако я не понимаю, как установить точку останова после вызова waitForDebugger(), чтобы я мог начать шагать.

Очевидно, что просто присоединение jdb приведет к немедленному продолжению работы приложения без остановки.

, например

jdb -attach localhost:8700

Есть ли способ установить точки останова перед запуском jdb или способ запустить jdb установить точки останова и затем присоединить?

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

jdb имеет файл конфигурации: ~ / .jdrbc в Linux. например, у меня есть:

stop in net.richardriley.myproj.myact.onCreate

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

1 голос
/ 24 июня 2010

К сожалению, виртуальная машина не может сообщить отладчику, что она уже приостановлена. Различные отладчики, которые я пробовал, запутываются, если исходное состояние отличается от «работает». В результате после подключения отладчика виртуальная машина должна возобновить все потоки. (Единственное исключение из вышесказанного - если виртуальная машина была только что запущена, и в этом случае она может отправить специальное сообщение «Я только что начал», указывающее, будет ли она запущена или будет приостановлена. Это здесь не помогает.)

Функция waitForDebugger () выполняет ожидание, пока начальный всплеск активности отладчика не прекратится. После подключения отладчика метод будет находиться в спящем режиме до тех пор, пока в течение 1,5 секунд не будет выполнено никаких действий отладчика. Это позволяет отладчику устанавливать любые точки останова до возобновления работы виртуальной машины.

Для Eclipse этот хак работает довольно хорошо, потому что вы можете настроить точки останова перед тем, как присоединить. Что касается jdb, я не могу сказать, чтобы он прикреплялся после того, как он запустился, поэтому вы должны быть быстрыми на клавиатуре или использовать какой-либо файл конфигурации (которого я тоже не вижу).

Вы можете решить эту проблему другим способом: под вызовом waitForDebugger добавьте цикл вроде:

static volatile boolean staticField = false;
  ...
while (!MyClass.staticField) {
    Log.d(tag, "waiting for go");
    Thread.sleep(2000);
}

Затем, после того, как вы настроили jdb так, как вы хотите, используйте что-то вроде:

> set MyClass.staticField = true

Если вы быстрые, вы можете пропустить цикл и просто Thread.sleep (5000), чтобы дать себе немного дополнительного времени, чтобы включить контрольные точки.

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

Я пробовал оба решения (одно от Фаддена и одно от Ричарда Райли), но ни одно из них не сработало. Приложение, запущенное в эмуляторе, разблокируется, как только jdb подключен к порту отладки (8700 через Dalvik), но затем он запускается самостоятельно, вообще не синхронизируясь с jdb. Введение цикла ожидания ничего не меняет, а команды точек останова в .jdbrc не действуют. Ответ jdb неизменно звучит так: «Отсрочка останова и т. Д. И т. Д. Он будет установлен после загрузки класса.», Поскольку приложение не было запущено; но если вы наберете «run», ответ будет «Ничего не приостановлено», так как приложение уже запущено ...

...