2009-12-05 3 views
9

Debug del mio codice con jdb di Java. Sono bloccato in un punto in cui il mio programma si aspetta l'input da riga di comando, ma jdb lo intercetta come un comando jdb.Come passare l'input della console a un programma Java in esecuzione anziché a jdb?

Come faccio a dire a jdb di passare il testo al programma in esecuzione?

Versione:

C:\Documents and Settings\*snip*>java -showversion 
java version "1.6.0_17" 
Java(TM) SE Runtime Environment (build 1.6.0_17-b04) 
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing) 

di compilazione:

javac -g LZWDecompress.java 

jdb.ini:

stop in LZWDecompress.decompress 
run 
monitor list 

Questo è ciò che accade:

Initializing jdb ... 
*** Reading commands from C:\Documents and Settings\*snip*\jdb.ini 
Deferring breakpoint LZWDecompress.decompress. 
It will be set after the class is loaded. 
> run LZWDecompress 
Set uncaught java.lang.Throwable 
Set deferred uncaught java.lang.Throwable 
> > > 
VM Started: Set deferred breakpoint LZWDecompress.decompress 
File to be decompressed: 

Al di sopra richiesto, entro in "test", e ricevo questa risposta:

... 
VM Started: Set deferred breakpoint LZWDecompress.decompress 
File to be decompressed: test 
Unrecognized command: 'test'. Try help... 
> 

Ecco il codice da funzione main (...), scritto dal nostro istruttore, non io:

public static void main(String[] args) throws IOException {  
    short [] source; 
    int dlen; 
    int sz; 
    byte [] decompressed; 
    BufferedReader br; 
    DataInputStream In; 
    FileInputStream FI; 
    FileOutputStream FO; 
    InputStreamReader isr; 
    String cfnm; 
    String sfnm; 

    source = new short[INPUT_FILE_IO_BUFFER_SIZE]; 
    decompressed = new byte[OUTPUT_FILE_IO_BUFFER_SIZE]; 

    isr = new InputStreamReader(System.in); 
    br = new BufferedReader(isr); 
    System.out.print("File to be decompressed: "); 
    System.out.flush(); 
    sfnm = br.readLine(); 
    System.out.print("Name of the decompressed file: "); 
    System.out.flush(); 
    cfnm = br.readLine(); 
    FI = new FileInputStream(sfnm); 
    In = new DataInputStream(FI); 
    FO = new FileOutputStream(cfnm); 
    for (sz=0; true; ++sz) { 
     try { source[sz] = In.readShort(); 
     } catch (EOFException e) { break; 
     } catch (Exception e) { System.out.print(e.toString()); 
     } 
    } 
    dlen = decompress(source, sz, decompressed); 
    FO.write(decompressed, 0, dlen); 
    FO.close(); 
} // end main() 
+0

Hey TofuBeer, grazie per il (modifica) chiarimenti. Quando dici "la riga di comando non è la stessa della console!" intendi dire quando l'applicazione è avviata, sto interagendo con la console invece della riga di comando? Non ho mai pensato a questa distinzione, quindi mi rallegro che tu lo abbia inventato. Grazie! : D – iokevins

risposta

6

Hmmm ... questo post sembra indicare che ho bisogno di eseguire il programma e quindi collegare il debugger ad esso. Ad esempio:

% java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n LZWDecompress 

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

Non è immediatamente evidente come si interrompe il programma dopo aver passato le funzioni di input dell'utente.

È questo il modo preferito per farlo?

Aggiornamento: allegare e configurare jdb (ad esempio, punti di interruzione) dopo che il programma in esecuzione richiede l'input dell'utente. Una volta configurato jdb, fornire l'input al programma in esecuzione. jdb quindi riprende l'esecuzione del programma nella seconda finestra. : D

+1

Sì, questo è il modo - ma invia il tuo secondo comando in un'altra finestra di terminale/processo, non lo stesso in cui hai eseguito il tuo programma Java. Ciò consente di avere un processo terminale con stdin/stdout dedicato al programma Java e un altro processo terminale con stdin/stdout dedicato a jdb. – delfuego

+0

Grazie delfuego! :) Funziona ora! – iokevins