10

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

1 に答える 1

7

うーん...この投稿は、プログラムを実行してからデバッガーを接続する必要があることを示しているようです。例えば:

% 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が2番目のウィンドウでプログラムの実行を引き継ぎます。:D

于 2009-12-05T22:20:28.910 に答える