2009-12-05 13 views
9

Debugowanie mojego kodu za pomocą jdb Java. Zatrzymałem się w punkcie, w którym mój program oczekuje wejścia linii poleceń, ale jdb przechwytuje je jako polecenie jdb.Jak przekazać dane wejściowe konsoli do działającego programu Java zamiast do jdb?

Jak powiedzieć jdb, aby przekazał tekst do uruchomionego programu?

Wersja:

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) 

opracowują:

javac -g LZWDecompress.java 

jdb.ini:

stop in LZWDecompress.decompress 
run 
monitor list 

To co się dzieje:

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: 

W wierszu powyżej, wchodzę "test" i odbierać tej odpowiedzi:

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

Oto kod z funkcji głównego (...), napisany przez naszego instruktora, nie ja:

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

Hej TofuBeer, dzięki za (edytuj) wyjaśnienie. Kiedy mówisz "linia poleceń nie jest taka sama jak konsola!" masz na myśli, mówiąc, kiedy aplikacja jest uruchomiona, jestem interakcji z konsoli zamiast z wiersza poleceń? Nie zastanawiałem się wcześniej nad tym rozróżnieniem, więc doceniam to, że je wymyśliłeś. Dzięki! : D – iokevins

Odpowiedz

6

Hmmm ... to post wydaje się wskazywać, że muszę uruchomić program, a następnie dołączyć do niego debugger. Na przykład:

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

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

Nie od razu wiadomo, jak zatrzymać program po przejściu przez funkcje wejściowe użytkownika.

Czy jest to preferowany sposób na zrobienie tego?

Aktualizacja : dołącz i skonfiguruj jdb (na przykład punkty przerwania), gdy uruchomiony program wyświetli monit o podanie danych przez użytkownika. Po skonfigurowaniu jdb podaj dane wejściowe do uruchomionego programu. jdb następnie przejmuje wykonywanie programu w drugim oknie. : D

+1

Tak, to jest sposób - ale wydaj drugie polecenie w innym oknie/procesie terminalowym, a nie tym, w którym uruchomiłeś program Java. Umożliwia to wykonanie jednego procesu terminalowego, który ma stdin/stdout poświęcony programowi Java, oraz innego procesu terminalowego ze stdin/stdout przeznaczonego dla jdb. – delfuego

+0

Dzięki delfuego! :) To działa! – iokevins

Powiązane problemy