2010-11-18 22 views
10

He estado tratando de conectar jdb al emulador Android por poco tiempo, y se han reunido en varias ocasiones con:"No se ha podido conectar a la máquina virtual a distancia" que conecta jdb al emulador de Android en Windows

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. 

No tan genial. ¿Cuál es la mejor manera de evitar esto? Me estoy ejecutando en Windows 7 64 bits.

+0

¿Se puede conectar a través del depurador? [Verifique mi respuesta aquí] (http://stackoverflow.com/questions/4199323/android-app-not-launching-on-emulator/4199575#4199575) –

+0

Hm, parece que las entradas en mi archivo de hosts están todas comentadas afuera, diciendo: # la resolución del nombre del localhost se maneja dentro del DNS mismo. # \t 127.0.0.1 localhost # \t :: 1 localhost –

+2

Encontrado * una * respuesta. De alguna búsqueda en Google, parece que jdb en Windows tiene por defecto una conexión de memoria compartida con una máquina virtual remota (http://www.herongyang.com/jtool/jdb_3.html). Resulta que podemos especificar un diferente tipo de conexión: > jdb -connect com.sun.jdi.SocketAttach: nombre de host = localhost, port = 8700 Set no detectada java.lang.Throwable Conjunto diferida no detectada java.lang.Throwable Inicializando jdb ... > Parece que se conecta, al menos. –

Respuesta

11

Actualmente esto funciona para mí: hacer un socket en lugar de una conexión de memoria compartida.

> jdb -sourcepath \ src -connect com.sun.jdi.SocketAttach: nombre de host = localhost, port = 8700

antemano lo que necesita hacer alguna configuración - por ejemplo, ver a este conjunto de useful details on setting up a non-eclipse debugger.. Incluye un buen consejo para la configuración del punto de interrupción inicial - crear o editar un archivo jdb.ini en su directorio personal, con contenidos como:

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

y recibirán carga y se aplaza hasta la conexión.

editar: se olvidó de hacer referencia Herong Yang's page.

+0

+1 para vincular a la ayuda de la página de Herong! –

+0

¿Alguna explicación para el downvote? –

0

Respuesta n. ° 1: Localice localhost en su archivo de hosts, como lo hice anteriormente. Sólo para estar seguro.

Respuesta n. ° 2: Si utiliza memoria compartida, el tamaño de bits podría convertirse fácilmente en un problema. Asegúrese de que esté usando el mismo ancho de palabra en todas partes.

+0

Gracias Mark - No estoy usando explícitamente la memoria compartida - al menos creo que tendré que averiguar qué está usando el emulador de Android, si entiendo correctamente. El hecho de que pueda conectarme con una conexión de socket sugiere que no es así. –

0

Intenta salir de Android Studio.

Tuve un problema similar en la Mac debido a que el daemon de ADB ya se estaba ejecutando. Una vez que cerrar todos los demonios ejecutándose, debería ver una salida similar a la siguiente:

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

Ver my other answer a una pregunta similar para más detalles y cómo iniciar/detener el demonio.

Cuestiones relacionadas