jdb дает java.net.SocketException: сброс соединения

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

Команды, которые я пробовал, следующие:

adb forward tcp:12345 jdwp:4127

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=12345

Можно предположить, что процесс с pid 4127 еще жив.

Однако после ввода двух команд я получил следующее сообщение об ошибке:

java.net.SocketException: Connection reset

at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:130)
at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232)
at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)
at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)
at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)
at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)
at com.sun.tools.example.debug.tty.Env.init(Env.java:63)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1066)

Я заметил странное поведение, когда этот вывод происходит только тогда, когда работает одно из моих приложений. Может ли это быть связано с конфликтом потоков, процессов или портов во время работы программы?

Я могу получить следующий вывод большую часть времени, когда это конкретное приложение закрыто:

Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> Input stream closed.

Я также попытался запустить командную строку в режиме администратора, выполнив следующие действия:

netsh advfirewall set global StatefulFTP disable
adb forward tcp:12345 jdwp:4127
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=12345

Результат выглядит следующим образом:

java.io.IOException: handshake failed - connection prematurally closed
        at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:136)
        at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232)
        at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)
        at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)
        at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)
        at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)
        at com.sun.tools.example.debug.tty.Env.init(Env.java:63)
        at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1066)

Fatal error:
Unable to attach to target VM.

person ykw    schedule 21.06.2016    source источник


Ответы (2)


Попробуйте выйти из Android Studio.

Проблема в том, что Android Studio поддерживает работу своего ADB, который конфликтует с вашим. Подробнее см. мой ответ на аналогичный вопрос.

person Zack Morris    schedule 22.09.2017

Проблема заключается в том, что моя программа запускает экземпляр моста отладки Android. Когда моя программа пытается запустить jdb, возникает состояние гонки для ADB. Поскольку моя программа уже создает экземпляр ADB до запуска jdb, jdb никогда не сможет успешно подключиться. Даже запуск jdb через командную строку дает тот же результат. Закрытие моей программы уничтожает экземпляр ADB, и поэтому я могу запустить jdb через командную строку после закрытия моей программы.

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

person ykw    schedule 23.06.2016