Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I pass console input to a running Java program instead of to jdb?

Debugging my code with Java's jdb. Am stuck at a point where my program expects command-line input, but jdb intercepts it as a jdb command.

How do I tell jdb to pass through text to the running program?

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

This is what happens:

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: 

At the prompt above, I enter "test", and receive this response:

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

Here is the code from function main(...), written by our instructor, not me:

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()
like image 850
iokevins Avatar asked Dec 05 '09 22:12

iokevins


People also ask

How to get access to the console in Java?

To get access to Console, call the method System.console (). Console gives three ways to read the input: String readLine () – reads a single line of text from the console.

How to read input from console in Java?

Ways to read input from console in Java. In Java, there are three different ways for reading input from the user in the command line environment(console). 1.Using Buffered Reader Class. This is the Java classical method to take input, Introduced in JDK1.0.

What is a console in Java?

A console is generally connected with Java processes which are started using the command-line tool. If the Java process has started automatically, (for example a background task), the console may not be available for input and output purposes. 1. Java read input from console By default, to read from system console, we can use the Console class.

What is the best way to take input in Java?

1.Using Buffered Reader Class This is the Java classical method to take input, Introduced in JDK1.0. This method is used... 2. Using Scanner Class This is probably the most preferred method to take input. The main purpose of the Scanner class... 3. Using Console Class It has been becoming a ...


1 Answers

Hmmm...this post seems to indicate I need to run the program and then attach the debugger to it. For example:

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

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

Not immediately obvious how I get the program to stop after passing by the user input functions.

Is this the preferred way to do this?

Update: attach and configure jdb (for example, breakpoints) once the running program prompts for user input. Once jdb is configured, provide input to the running program. jdb then takes over program execution in the second window. :D

like image 66
iokevins Avatar answered Oct 21 '22 02:10

iokevins