“无法连接到远程VM”将jdb连接到Windows上的Android模拟器

时间:2010-11-18 22:17:38

标签: java windows debugging android-emulator jdb

我一直试图将jdb连接到android模拟器一段时间,并且已经反复遇到过:

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.

不太好。绕过这个最好的方法是什么?我在Windows 7 64bit上运行。

4 个答案:

答案 0 :(得分:14)

目前这对我有用 - 制作套接字而不是共享内存连接。

> jdb -sourcepath。\ src -connect com.sun.jdi.SocketAttach:hostname = localhost,port = 8700

事先你需要做一些设置 - 例如,看看这组useful details on setting up a non-eclipse debugger。它包含一个设置初始断点的好提示 - 在主目录中创建或编辑jdb.ini文件,内容如下:

stop at com.mine.of.package.some.AClassIn:14

并且它们将被加载并推迟到连接之前。

编辑:忘记参考Herong Yang's page

答案 1 :(得分:1)

尝试退出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 ...
> 

有关详细信息以及如何启动/停止守护程序,请参阅my other answer类似问题。

答案 2 :(得分:0)

答案#1:在我之前链接的主机文件中映射localhost。只是为了确定。

答案#2:如果您使用的是共享内存,则bit-size很容易成为问题。确定确定你到处使用相同的字宽。

答案 3 :(得分:0)

要调试应用程序,请按照以下步骤操作:

在设备上打开应用程序。

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

adb jdwp

使用以下参数启动JVM:

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

此命令的预期输出:

Listening for transport dt_shmem at address: <port>

使用jdb附加应用程序:

jdb -attach <port>

如果jdb成功附加,我们将看到jdb cli。

示例:

> 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]