2009-10-16 4 views
6

Estoy usando Eclipse para desarrollar un programa Java, y pensé que agregaría una opción a mi programa para analizar stdin si no hay argumentos. (de lo contrario, analiza un archivo)Java + Eclipse: ¿cómo depurar un programa java que está recibiendo canalizado/redireccionado stdin?

Estoy teniendo problemas si ejecuto "somecommand | java -jar myjar.jar" y fui a depurar ... entonces me di cuenta de que no sé cómo iniciar un proceso en Eclipse de esa manera. Y si lo ejecuto en el símbolo del sistema, no puedo adjuntarlo a un proceso en ejecución ya que el proceso comienza inmediatamente.

¿Alguna sugerencia sobre cómo depurar?

edit: mira, lo que pasa es que escribí mi programa originalmente para tomar un argumento de nombre de archivo. Luego pensé que sería útil que tomara stdin también, así que hizo abstract InputStream fuera de mi programa (como lo sugiere el Sr. Queue). Funciona bien al funcionar en un archivo (java -jar myjar.jar myfile), pero no funciona cuando ejecuto type myfile | java -jar myjar.jar. Sospecho que hay algo diferente en los dos escenarios (¿la detección de eof es diferente?) Pero realmente me gustaría depurar.

// overall program structure follows: 

public static void doit(InputStream is) 
{ 
    ... 
} 

public static void main(String[] args) 
{ 
    if (args.length > 0) 
    { 
     // this leaves out the try-catch-finally block, 
     // but you get the idea. 
     FileInputStream fis = new FileInputStream(args[0]); 
     doit(fis); 
     fis.close(); 
    } 
    else 
    { 
     doit(System.in); 
    } 
} 
+0

¿Poner los args en su configuración de ejecución de Eclipse hace el truco? – javamonkey79

+0

Estos no son args. Es el hecho de que tengo que canalizar en algún comando. –

Respuesta

11

ejecutar su aplicación , con la tubería, en la línea de comandos, pero agregue argumentos de JVM para la depuración remota, como esta:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044 

suspend=y le dirá a la JVM que no ejecute realmente el programa hasta que se haya conectado el depurador.

A continuación, vaya a las configuraciones de inicio de depuración de Eclipse (Run -> Debug Configurations...) y cree una "Aplicación Java remota" para conectarse a su aplicación.Ejecute el lanzamiento en Eclipse (después de establecer algunos puntos de interrupción) y podrá depurar. No es muy conveniente, pero si no puedes reproducir tus problemas sin la tubería, esta es una opción.

+0

gracias, eso funciona! ahora para sujetar con seguridad mi sombrero de depuración y seguir adelante:/ –

+0

No hay problema. ¡Buena suerte! –

4

Si estoy interpretando su pregunta correcta, creo que lo que desea saber cómo enviar a través de la entrada estándar y de depuración a través de él en eclipse.

Si se trata de una entrada simple, puede ingresar manualmente los datos de System.in a través de la ventana de la consola del eclipse mientras se ejecuta el programa. Simplemente comience a escribir en la ventana de la consola y presione enter para enviar el texto a Standard in.

Si es algo más complicado, le sugiero que resuma la lectura que está tratando de hacer para tomar un InputStream. En su programa, puede enviar System.in como InputStream. Para depurar, puede enviar cualquier otro InputStream. Por ejemplo, puede poner su entrada en un archivo y pasar un FileInputStream al método para probarlo.

EDITAR: Sin ver un poco más de código, no estoy seguro, pero podría estar en algo con eof detección. Un FileInputStream tiene un final de archivo definido, pero supongo que System.in no tiene nada de eso. Su lector podría estar esperando leer el siguiente personaje y nunca avanzar. Es posible que deba detener manualmente la lectura después de saber que ha leído "suficiente".

+0

Tiene la pregunta correcta, pero vea mis ediciones (de próxima aparición ...) –

0

Quizás this solution de crear una tubería con nombre podría aplicarse aquí.

mkfifo foo 
somecommand > foo 

A continuación en la configuración de depuración, agregue < foo en los argumentos, por lo que su programa está depurado como:

java-jar myjar.jar < foo

+1

no, porque por lo que yo sé, el depurador no me permite construir la línea de comando "java -jar ..." (FWIW, si Entiendo bien, la JVM ya se está ejecutando en Eclipse) –

Cuestiones relacionadas