-
Où visualiser stderr ?
Bonjour,
J'ai un programme Windows où un certain nombre d'erreurs sont imprimées dans stderr. J'aimerais pouvoir visualiser cette sortie. Les descriptions de ce flux standard indiquent que stderr est par défaut dirigé vers le terminal.
Or Windows et terminal, bof, bof.
J'ai d'abord pensé à la console de Visual C++ (V6), mais aucun signe de vie.
J'ai tenté d'exécuter le programme à partir d'un invite de commande, mais le programme rend tout de suite la main à la console, c'est un programme Windows...
J'ai réussi sur une partie de code à rediriger stderr vers un fichier. Je pourrais mettre cette redirection permanente pour toute l'application, mais j'aimerais bien le faire en dernier ressort, car dans ce cas, je ferme le fichier à la fermeture, et je ne peux faire de debug pas à pas en exploitant ces stderr.
Une solution pour visualiser ce flux d'erreur ?
-
Typiquement, on fait ce genre de truc en ligne de commande.
Code:
monprogramme.exe 2>err.txt
-
Désolé, avec cette méthode j'ai bien la création de erreur.txt, mais il est vide, aucune sortie.
Alors qu'il est certain que je passe au moins une fois par un
Code:
fprintf(stderr, "Mon erreur");
-
Je crois me rappeler que sous windows, le flux stderr est affiché dans la console mais ne peut pas être redirigé
-
Faux: je viens de faire le test sous windows: la sortie stderr existe et est redirigeable comme sous linux.
Essaye ça:
echo blabla > bla.txt (crée un fichier)
del bla.txtt 2>err1.txt (essaie de supprimer un fichier inexistant)
type err1.txt (affiche le fichier: tu vois "Impossible de trouver le fichier")
del bla.txt 2>err2.txt (essaie de supprimer le fichier qui existe)
type err2.txt (affiche le fichier: il est vide, pas d'erreur)
Benz
-
Salut, et bienvenue sur le forum
Déjà, printf, c'est moyen moyen en C++...
Il faudrait vraiment préférer cout, cerr, clog (selon) et l'opérateur de flux "<<"
Ensuite, même si c'est dans un fil de discussion qui n'était pas parti dessus, le sujet a été abordé il y a un ou deux jour(s) à peine, une recherche sur le forum t'aurais sans doute fournis directement la réponse ;)
Enfin, il est bon de penser à consulter la FAQ, car il y a justement une entrée sur le sujet
Voilà, je crois que tout est dit, mais, s'il faut de précisions, on reste disponibles ;)
-
-
Je vous remercie de votre sollicitude. Mais je crois m'être servi de la fonction rechercher et faq. J'aurais pu rater un sujet ou deux. Il est toujours utile de la part d'habitué de pointer vers les sujets adéquats. Il y a même certaines choses qui sont dans la faq qui surprennent des habitués, pour dire... Mais ma question est un différente de la simple redirection de flux standard.
Comme je l'ai dit, j'ai déjà pu redirigé ce flux. Je n'ai peut-être pas utilisé la bonne méthode, car je redirige le flux, mais il faut que j'attende la fermeture du fichier pour voir ce qui a été écrit.
un "monprogramme.exe 2>err.txt" ne fonctionne pas.
Pour la redirection, j'essaierai vos pistes.
MAIS
Je cherche à visualiser le flux standard d'erreur, pas à le rediriger. Ce flux est par défaut dirigé quelque part ! C'est cet endroit que je n'arrive pas à localiser, et que j'aimerais que vous m'indiquiez.
Je sais aussi que c'est par défaut dans la console, mais j'ai déjà dit tout ça dans le premier message...
-
Il n'y a rien en standard pour rediriger un flux de sortie vers ailleurs que l'extérieur du programme.
Sous POSIX, tu dois pouvoir créer un tube et faire un freopen() dessus. Sous Windows, tu dois pouvoir faire la même chose en un peu plus compliqué...
Edit: Même pas, tu peux faire aussi simple.
Edit2: Ah non, tu ne peux pas redigirer une sortie standard vers un tube anonyme: Il n'existe pas de fonction qui cumule les effets de fdopen() et freopen()...
-
Ceci dit, il faut bien comprendre que le plus gros problème des composants windows, c'est qu'ils ont été déconnecté de la sortie "console"...
Or, par défaut, la sortie de std::cerr, c'est... la sortie standard (la console, par défaut)
dés lors, je crains qu'il ne faille ruser, et passer, pourquoi pas, par l'affichage dans un messagesbox (ou dans n'importe quelle autre partie visuelle de l'application, quitte à la cacher par la suite) de l'erreur obtenue, si la solution d'un fichier ne te convient vraiment pas.
Cela peut éventuellement impliquer de devoir lancer une exception pour faire "remonter" l'erreur vers l'interface graphique, mais tout cela est sujet à réflexion par rapport à ton cas particulier ;)
-
Ah, j'avais oublié qu'on était en C++.
On ne peut pas rediriger si facilement stderr, mais pour cerr, c'est une autre histoire.
Un stream C++ peut être redirigé absolument n'importe où...
-
Pourquoi ne compile tu pas en mode console en debug??
Surtout si t'es en VC6
-
Bonne question,
Je ne connais pas tous les mystères de la compilation en mode console en debug, mais j'ai tous mes messages printf(), qui s'affiche dans la console VC6. Je pense donc être dans un bon mode debug.
Est-ce que lorsqu'on voit le résultat de printf dans la console VC6 je suis dans ce mode console en debug ?
Si oui, où est-ce que je vois cette fameuse sortie standard d'erreur ?
Si non, comment je fais pour avoir ce mode qui me permettrait d'avoir à la fois la sortie normale et la sortie erreur ?
-
Voici quelque chose qui t'aidera pour rediriger un peu où tu veux les flux standards, déjà donné par Mongaulois, mais j'insiste : http://cpp.developpez.com/faq/cpp/?p...SL_redirection
cerr normalement écrit dans stderr.txt, mais grâce à l'entrée de FAQ, tu peux rediriger où tu veux.
C'est une solution qui vaut ce qu'elle vaut, pour ton problème.
-
Regarde ce thread
http://www.developpez.net/forums/sho...ht=console+vc6
il explique comment mettre et enlever la console avec VC6