Ошибка shmemBase_attach при подключении к устройству Android

Я пытаюсь подключить JDB на моем компьютере к процессу (на самом деле, к любому процессу) на моем устройстве Android, но он не работает вообще.

Таким образом, команды, которые я использовал, прямо из Документации Google ADB. Сначала я делаю

adb forward tcp:3456 jdwp:pid

Затем после этого я пытаюсь использовать JDB, чтобы попытаться подключить

jdb -attach emulatorIP:3456

Но я получаю следующую ошибку:

java.io.IOException: shmemBase_attach failed: The system cannot find the file specified

    at com.sun.tools.jdi.SharedMemoryTransportService.attach0(Native Method)
    at com.sun.tools.jdi.SharedMemoryTransportService.attach(SharedMemoryTransportService.java:108)
    at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)
    at com.sun.tools.jdi.SharedMemoryAttachingConnector.attach(SharedMemoryAttachingConnector.java:63)
    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.

РЕДАКТИРОВАТЬ: У меня есть больше потенциальных клиентов, но я не близко к фактическому решению.

JDB -attach по какой-то причине по умолчанию использует отладку с использованием метода общей памяти, несмотря на то, что вся документация настаивает на том, что указание hostname: port в качестве параметров -attach заставит его использовать сокеты для удаленной отладки. Чтобы форсировать его, вы используете команду, представленную в ответе ykw, но она все равно не работает из-за какой-то ошибки подключения.

После дальнейшего изучения выясняется, что JDB и ADB конфликтуют друг с другом на каком-то неизвестном ресурсе, вызывая различные ошибки соединения с сокетом. Мой текущий обходной путь - полностью отключить ADB и запустить JDB, затем, когда я закончу с JDB, я снова включу ADB. Неприемлемо ни в коем случае, и я надеюсь, что это поможет кому-то с более глубокими знаниями точно определить, что не так!

Ответы на вопрос(2)

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

Его АБР работает, даже если ваш проект не работает. Вот пример, где я вышел из Android Studio, запустил ADB, запустил мое приложение на устройстве, затем снова запустил ADB, чтобы увидеть новый идентификатор процесса, перенаправил порт и, наконец, подключил JDB:

$ adb -d jdwp
* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *
28462
^C
$ adb -d jdwp
28462
1939
^C
$ adb -d forward tcp:7777 jdwp:1939
$ jdb -attach localhost:7777 -sourcepath ./src
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> 

Вы также можете включать и выключать ADB в Android Studio:

Android Studio->Tools->Android->Enable ADB Integration

Когда интеграция ADB отключена, вы можете запускать ADB из консоли как обычно. Вы также можете управлять и создавать фоновые ADB-демоны с помощью:

adb kill-server
adb start-server

Я потратил пару часов на это, так что действительно нужна лучшая документация. Также мне хотелось бы знать, как запустить отладчик Android Studio и JDB одновременно, чтобы можно было профилировать все вызовы методов при пошаговом выполнении отладчика (поскольку встроенная трассировка монитора Android Studio не показывает последовательные вызовы методов с аргументами)

http://mybrainoncode.com/blog/2013/11/03/debugging-android-with-jdb/

https://teaspoon-consulting.com/articles/tracing-java-method-calls.html

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

Теоретически вы должны получить следующий вывод:

Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>

Тем не менее, я получил следующее:

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)

Кто-нибудь знает, почему это происходит?

Хорошо ... Выше проблема была решена. Это связано с конфликтом между вызовами ADB. В любой момент времени должен быть запущен только один экземпляр adb. Это произойдет, когда jdb попытается подключиться, пока adb уже запущен в вашей программе. JDB никогда не сможет успешно подключиться в этом состоянии.

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

 ykw24 июн. 2016 г., 10:46
@starkipraggy - Надеюсь, что мои пояснения помогут вам. Хм ... у меня тоже раньше была проблема сброса соединения. Это связано с тем, что запущен еще один экземпляр adb. У меня странное ощущение, что у вас есть другая программа, которая инициализирует AndroidDebugBridge. Попробуйте закрыть этот экземпляр и повторите попытку подключения.
 starkipraggy24 июн. 2016 г., 06:25
-1 за фактическое отсутствие ответа, хотя я должен признать, что получил аналогичную ошибку. В моем случае я получил сброс соединения при попытке подключения

Ваш ответ на вопрос