2010-11-18 4 views
10

Ho cercato di collegare JDB per l'emulatore di Android per un po ', e sono state soddisfatte ripetutamente con:"Impossibile connettersi al VM remoto" che collega JDB per l'emulatore di Android su 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. 

Non così eccezionale. Qual è il modo migliore per aggirare questo? Sono in esecuzione su Windows 7 a 64 bit.

+0

È possibile connettersi tramite il debugger? [Controlla la mia risposta qui] (http://stackoverflow.com/questions/4199323/android-app-not-launching-on-emulator/4199575#4199575) –

+0

Hm, sembra che le voci nel mio file hosts siano tutte commentate fuori, dicendo: # la risoluzione dei nomi localhost viene gestita all'interno del DNS stesso. # \t 127.0.0.1 localhost # \t :: 1 localhost –

+2

Trovato * una * risposta. Da alcuni googling sembra che jdb su Windows passi automaticamente a una connessione di memoria condivisa con una VM remota (http://www.herongyang.com/jtool/jdb_3.html). Si scopre che siamo in grado di specificare un diverso tipo di connessione: > JDB -connect com.sun.jdi.SocketAttach: hostname = localhost, port = 8700 Impostare uncaught java.lang.Throwable Imposta differita non rilevata java.lang.Throwable Inizializzazione jdb ... > Questo sembra collegarsi, almeno. –

risposta

11

Attualmente questo funziona per me: creare un socket anziché una connessione di memoria condivisa.

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

Precedentemente è necessario fare alcune operazioni di configurazione - per esempio, si veda questo insieme di useful details on setting up a non-eclipse debugger.. Esso comprende un buon consiglio per impostare il punto di interruzione iniziale - creare o modificare un file jdb.ini nella vostra home directory, con contenuti come:

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

e che otterranno caricato e differita fino connessione.

modifica: dimenticato il riferimento Herong Yang's page.

+0

+1 per il collegamento all'aiuto dalla pagina di Herong! –

+0

Qualche spiegazione per il downvote? –

0

Risposta n. 1: mappare localhost nel file hosts, come ho collegato in precedenza. Giusto per essere sicuro.

Risposta n. 2: Se si utilizza la memoria condivisa, le dimensioni in bit potrebbero facilmente diventare un problema. Fai sicuro stai usando la stessa larghezza di parole ovunque.

+0

Grazie Mark - Non sto utilizzando esplicitamente la memoria condivisa - almeno penso che avrei bisogno di scoprire che cosa sta usando l'emulatore Android, se ho capito bene. Il fatto che riesca a connettermi con una connessione socket suggerisce che non lo è. –

0

Provare ad uscire da Android Studio.

Ho avuto un problema simile sul Mac a causa del daemon ADB già in esecuzione. Una volta che si esce da tutti i demoni in esecuzione, si dovrebbe vedere un output simile al seguente:

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

Vedi my other answer a una domanda simile per maggiori dettagli e come avviare/fermare il demone.