Как передать консольный ввод в работающую программу Java вместо jdb? - PullRequest
10 голосов
/ 06 декабря 2009

Отладка моего кода с помощью Java JDB. Я застрял в точке, где моя программа ожидает ввода из командной строки, но jdb перехватывает его как команду jdb.

Как мне сказать jdb проходить через текст работающей программе?

Версия:

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)

Компиляция:

javac -g LZWDecompress.java

jdb.ini:

stop in LZWDecompress.decompress
run
monitor list

Вот что происходит:

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: 

В приведенном выше запросе я ввожу "test" и получаю этот ответ:

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

Вот код из функции main (...), написанный нашим инструктором, а не мной:

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()

1 Ответ

6 голосов
/ 06 декабря 2009

Хммм ... эта запись , кажется, указывает на то, что мне нужно запустить программу и затем присоединить к ней отладчик. Например:

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

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

Не сразу очевидно, как заставить программу остановиться после прохождения через функции пользовательского ввода.

Это предпочтительный способ сделать это?

Обновление : подключите и настройте jdb (например, точки останова), когда запущенная программа запрашивает ввод данных пользователем. Как только jdb настроен, предоставьте вход для работающей программы. Затем JDB берет на себя выполнение программы во втором окне. : D

...