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