2009-12-05 9 views
9

Déboguer mon code avec Java jdb. Je suis bloqué à un point où mon programme attend l'entrée de la ligne de commande, mais jdb l'intercepte comme une commande jdb.Comment passer l'entrée de la console à un programme Java en cours d'exécution plutôt qu'à jdb?

Comment puis-je dire à jdb de transmettre le texte au programme en cours d'exécution?

Version:

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) 

Compile:

javac -g LZWDecompress.java 

jdb.ini:

stop in LZWDecompress.decompress 
run 
monitor list 

Voici ce qui se passe:

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: 

À l'invite ci-dessus, j'entre "test", et de recevoir cette réponse:

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

Voici le code de la fonction principale (...), écrit par notre instructeur, pas moi:

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, merci pour la (modification) clarification. Quand vous dites "la ligne de commande n'est pas la même que la console!" voulez-vous dire quand l'application est lancée, j'interagis avec la console au lieu de la ligne de commande? Je n'ai jamais pensé à cette distinction auparavant, alors je vous remercie de l'avoir soulevé. Merci! : D – iokevins

Répondre

6

Hmmm ... ce post semble indiquer que j'ai besoin d'exécuter le programme, puis de lui attacher le débogueur. Par exemple:

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

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

Pas immédiatement évident comment j'arrête le programme après être passé par les fonctions d'entrée de l'utilisateur.

Est-ce la meilleure façon de procéder?

Mise à jour: attachez et configurez jdb (par exemple, des points d'arrêt) une fois que le programme en cours vous invite à entrer des données. Une fois que jdb est configuré, fournir une entrée au programme en cours d'exécution. jdb prend ensuite en charge l'exécution du programme dans la seconde fenêtre. : D

+1

Oui, c'est le cas - mais lancez votre deuxième commande dans une autre fenêtre/un autre processus, pas le même dans lequel vous avez exécuté votre programme Java. Cela vous permet d'avoir un processus de terminal avec stdin/stdout consacré à votre programme Java et un autre processus de terminal avec stdin/stdout consacré à jdb. – delfuego

+0

Merci delfuego! :) Cela fonctionne maintenant! – iokevins

Questions connexes