2009-11-18 4 views
2

Je suis en train de déboguer un programme Java dans Eclipse. Ce programme écrit normalement des données binaires sur sa sortie standard, mais il peut écrire des messages d'erreur et empiler des traces dans son flux d'erreurs standard.Sortie standard séparée de l'erreur standard lors de l'exécution d'un programme dans Eclipse

Je souhaite rediriger les données binaires vers un fichier, tout en continuant à afficher la sortie d'erreur standard dans une console. C'est trivial en cours d'exécution à partir de la ligne de commande. Est-ce possible sous Eclipse? Jusqu'à présent, j'ai seulement compris comment rediriger la sortie standard et l'erreur standard vers le même fichier. Je ne vois pas un moyen de séparer les deux autres que d'ajouter une nouvelle option de ligne de commande au programme.


connexes: I/O redirection in Eclipse?

Répondre

4

Pouvez-vous essayer de rediriger votre flux stdout vers une vue personnalisée avec un texte SWT, laissant stderr à la console par défaut.
Voir this thread

import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 


import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.*; 


public class ConsumeSysout { 


    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new FillLayout()); 
     final Text text = new Text(shell, SWT.NONE); 
     shell.open(); 


     OutputStream out = new OutputStream() { 
      @Override 
      public void write(int b) throws IOException { 
       text.append(Character.toString((char) b)); 
      } 
     }; 
     System.setOut(new PrintStream(out)); 


     System.out.println("Hello World!"); 


     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 
} 
0

Deux solutions viennent à l'esprit en ce moment pour stdout de filtrage/stderr dans une console indépendante (mais ils ne sont pas pour les flux binaires, donc le mode communautaire Wiki):

  • Soit ne réorientent rien (toutes les sorties sont dans la console), et utiliser un plugin comme Grep Console pour mettre en évidence des résultats pertinents

    http://marianold.schedenig.name/grepconsole/img/grepconsole.png

  • et/ou tout rediriger dans un fichier, et utiliser un plugin comme NTail et utiliser des « lignes de filtre » pour exclure des lignes sélectionnées dans l'affichage du fichier journal (qui peut être plus proche de ce que vous cherchez).

    http://www.certiv.net/images/NTailScreenShot001.jpg

(Vous pouvez définir un grand nombre d'une vue NTail que vous avez besoin/envie.)

+0

NTail est conçu pour le filtrage de texte et ne convient pas pour les données binaires * * mon programme écrit normalement stdout. – finnw

+0

Droite ... binaire. Oups. Je laisse cette réponse en mode Community-Wiki pour l'archivage. – VonC

+0

Les deux liens d'image sont rompus. –

1

Eh bien, vous pouvez remplacer System.out avec votre propre PrintStream qui écrit dans un fichier . J'écris juste ce brassard hors, alors peut-être il est pas tout à fait tout à fait raison, mais vous voyez l'idée:

FileOutputStream fos = new FileOutputStream("c:\myfile.bin"); 
BufferedOutputStream bos = new BufferedOutputStream(fos); 
PrintStream ps = new PrintStream(bos); 
System.out = ps; 

Ce, ou quelque chose de très similaire devrait faire l'affaire. Toutes les sorties qui vont normalement à la sortie standard vont maintenant aller dans ce fichier (n'oubliez pas de fermer() le Printstream lorsque vous fermez votre programme, ou il ne sera pas toujours vider la dernière des données sur le fichier.)

Bien sûr, vous pouvez également faire le même tour avec System.err si vous le souhaitez.

+0

Cela fonctionne, mais j'espérais trouver un moyen de le faire dans l'EDI, sans modifier le code d'E/S de l'application – finnw

2

De (http://www.eclipsezone.com/eclipse/forums/t52910.html):

Si quelqu'un souhaite voir les chaînes écrites à System.out/System.err par un plugin déjà déployé dans Eclipse, il peut être fait en exécutant Eclipse en mode débogage à partir de l'invite de commande en tant que eclipse.exe -debug. Ou bien vous pouvez pirater un peu pour capturer le stderr/stdout de la machine virtuelle Java (en cours d'exécution Eclipse) comme décrit dans Redirect stdout and stderr of Eclipse to a file (Eclipse 3.0 on WinXP)

Si vous exécutez Eclipse en mode débogage, vous devriez être en mesure de démarrer à partir d'une commande ligne et inclure une redirection stderr. Dans Unix ce serait "commande 2> fichier".

Ce fil a un contenu connexe: Redirect STDERR/STDOUT of a process AFTER it's been started, using command line?

Ce lien est plus DOS/Windows spécifique: Stderr

L'interpréteur de commandes DOS, command.com, offre pas signifie rediriger stderr. En raison de que, il est impossible d'enregistrer dans un fichier , ou un tuyau dans un programme, les messages un programme imprime à stderr. "Foo> out" redirige uniquement stdout de foo, pas stderr. Ce dernier va toujours à la console.

Depuis stderr est généralement où les messages d'erreur importants sont imprimés, ce est extrêmement regrettable, car cela nous rend incapables de détecter les erreurs dans emplois sans surveillance.

Alors, que faites-vous? Une solution consiste à passer à Unix, où la coquille permet une rediriger ce flux. Avec sh et ses dérivés, utilisez

foo >out 2>&1 

pour sauver à la fois stdout et stderr de foo à sortir. De même, en utilisant

foo 2>&1 | bar 

à tube à la fois stdout et stderr de foo en bar. Si vous êtes coincé avec DOS, Stderr est ce dont vous avez besoin.

Stderr exécute une commande et fusionne son dans son stdout stderr. Par conséquent, ou redirigeant stdout de tuyauterie est équivalent à faire la même chose à stderr aussi bien.

Je vais devoir continuer à chercher des solutions Windows. PowerShell est devenu populaire, et il pourrait être intéressant de vérifier.

+0

Idées et liens intéressants. +1 – VonC

+0

Redirige [fonctionne avec CMD] (https://stackoverflow.com/questions/11060166) (par exemple, un fichier Windows .bat invoque). Exemple: '2> nul' redirige l'erreur standard vers le flux nul. –

Questions connexes