Java &引用;无法连接到远程虚拟机";将jdb连接到Windows上的android仿真器

Java &引用;无法连接到远程虚拟机";将jdb连接到Windows上的android仿真器,java,windows,debugging,android-emulator,jdb,Java,Windows,Debugging,Android Emulator,Jdb,我尝试将jdb连接到android emulator已有一段时间了,并且多次遇到以下问题: jdb -sourcepath ./src -attach localhost:8700 java.io.IOException: shmemBase_attach failed: The system cannot find the file specified at com.sun.tools.jdi.SharedMemoryTransportService.attach0(Nati

我尝试将jdb连接到android emulator已有一段时间了,并且多次遇到以下问题:

jdb -sourcepath ./src -attach localhost:8700 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:90) at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:98) at com.sun.tools.jdi.SharedMemoryAttachingConnector.attach(SharedMemoryAttachingConnector.java:45) at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:358) at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:168) at com.sun.tools.example.debug.tty.Env.init(Env.java:64) at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1010) Fatal error: Unable to attach to target VM. jdb-sourcepath./src-attachlocalhost:8700 java.io.IOException:shmemBase\u attach失败:系统找不到指定的文件 位于com.sun.tools.jdi.SharedMemoryTransportService.attach0(本机方法) 位于com.sun.tools.jdi.SharedMemoryTransportService.attach(SharedMemoryTransportService.java:90) 位于com.sun.tools.jdi.genericatachingconnector.attach(genericatachingconnector.java:98) 在com.sun.tools.jdi.SharedMemoryAttachingConnector.attach上(SharedMemoryAttachingConnector.java:45) 位于com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:358) 位于com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:168) 位于com.sun.tools.example.debug.tty.Env.init(Env.java:64) 位于com.sun.tools.example.debug.tty.tty.main(tty.java:1010) 致命错误: 无法连接到目标VM。 不太好。最好的办法是什么?我运行的是64位Windows 7。

回答#1:在您的主机文件中映射本地主机,正如我前面链接的那样。只是想确定一下


回答#2:如果使用共享内存,位大小很容易成为一个问题。确保您在任何地方都使用相同的字宽。

目前这对我来说很有效——创建套接字而不是共享内存连接

>jdb–源路径。\src-connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

事先您需要进行一些设置——例如,请参阅这组。它包括一个设置初始断点的好技巧——在主目录中创建或编辑一个jdb.ini文件,内容如下:

stop at com.mine.of.package.some.AClassIn:14 停在com.mine.of.package.some.AClassIn:14 它们将被加载并延迟到连接


编辑:忘记引用。

尝试退出Android Studio。

由于ADB守护进程已经运行,我在Mac上遇到了类似的问题。退出任何正在运行的守护进程后,您将看到类似以下内容的输出:

$ 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 ...
> 

有关更多详细信息以及如何启动/停止守护进程,请参阅类似问题。

要调试应用程序,请执行以下步骤:

打开设备上的应用程序

使用jdwp查找PID(确保清单中的“android:debugable”设置为true):

使用以下参数启动JVM:

java -agentlib:jdwp=transport=dt_shmem,server=y,address=<port> <class>

你能通过调试器连接吗?嗯,看起来我的主机文件中的条目都被注释掉了,说:#本地主机名解析在DNS本身内处理#127.0.0.1 localhost#:::1 localhost找到了答案。通过谷歌搜索,似乎Windows上的jdb默认为与远程VM()的共享内存连接。事实证明,我们可以指定不同的连接类型:>jdb-connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700 Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable初始化jdb…>至少看起来是连接的。我仍然建议您将本地主机的目标设置为127.0.0.1。DNS不应该触摸它。。。您的DNS可能只返回IPv6而不是IPv4地址。你无法控制。你可以控制你的“主机”。谢谢马克——我没有明确使用共享内存——如果我理解正确的话,至少我想我需要知道android仿真器在使用什么。事实上,我可以通过套接字连接进行连接,这表明它不是。拯救了我的一天!:)
java -agentlib:jdwp=transport=dt_shmem,server=y,address=<port> <class>
Listening for transport dt_shmem at address: <port>
jdb -attach <port>
> adb jdwp
  12300
> java -agentlib:jdwp=transport=dt_shmem,server=y,address=8700 com.app.app
  Listening for transport dt_shmem at address: 8700
> jdb -attach 8700
  main[1]