Ventanas de consola de registro al archivo pierde final de la cola, si la aplicación se bloquea; la forma de ver el final de la cola?

StackOverflow https://stackoverflow.com/questions/1080090

Pregunta

Construimos herramientas complicadas basadas en la consola que producen una gran cantidad de comentarios sobre la consola. Estas herramientas procesan una gran cantidad de datos y por lo tanto se ejecuta son caros y que no les gusta hacer más a menudo de lo necesario, especialmente durante las pruebas en las que ya tenemos que ejecutar repetidamente. Durante estas pruebas, a menudo registrar el resultado en un archivo para capturar este comentario para la inspección:        C:> [ourcommand]> log.txt Cuando la aplicación se ejecuta hasta su finalización, esto funciona muy bien.

Si la aplicación se bloquea (referencia de memoria ilegal, etc.), Windows chuletas desagradablemente fuera el archivo de registro antes de que el extremo de la cola del comentario por lo que no podemos ver lo que estaba ocurriendo en el momento del accidente. También chuletas de la salida de la consola en el mismo lugar. Por lo tanto, cuando obtenemos un archivo de registro truncado, tenemos que hacer todo de nuevo sin el archivo de registro, para ver la respuesta final. Windows no parece amortiguar la salida de la consola, si no el registro.

¿Hay una manera de decirle a Windows que no amortiguar la salida de la consola al iniciar la sesión? Nuestra aplicación hace uso del sistema de tiempo de ejecución (Windows) C y un tiempo atrás que utiliza "setvbuf" como sigue:       setvbuf (stdout, NULL, _IONBF, 0); pero fue en vano.

¿Fue útil?

Solución

Puede vaciar el búfer de la consola en cualquier punto:

Console.Out.Flush();

Esto utiliza TextWriter.Flush () .

Si tiene que asegurarse de que esto sucede siempre, sería bastante fácil de escribir un método para la consola que funcionaba como WriteLine, pero incluyó una declaración ras al final.


Editar:

No se ha especificado un idioma ... Voy a escribir un ejemplo usando C #.

En C #, fácilmente se podría hacer una clase de utilidad estática que proporciona un método como:

public static class FlushingConsole {
    public static void WriteLine(string format, params Object[] args) {
        Console.WriteLine(format, args);
        Console.Out.Flush();
    }
    // Add other overloads as required
}

A continuación, sólo llamar a:

FlushingConsole.WriteLine(....);

El mismo enfoque debería funcionar en casi cualquier otro idioma, también.


Editar 2:

Ya que estás usando C ++, hay un par de opciones que no sean setvbuf que pueda ser de interés.

En primer lugar, usted debe ser capaz de apagar el tampón en cout haciendo:

cout.unsetf(ios_base::unitbuf);

También puede ser necesario para establecer sync_with_stdio si va a mezclar stdio. (es decir: printf) con iostreams

Otros consejos

No se ha especificado el idioma, pero para C ++ que debe ser capaz de llamar setvbuf con stdout como el primer parámetro para desactivar el almacenamiento en búfer.

Usted está aparentemente utilizando la salida estándar. Es mejor utilizar "error estándar". (Stderr en la biblioteca C, cerr en iostreams) Aquellos que no están tamponadas. O puede utilizar FlushFileBuffers (o analógica), cada vez que desee sincronizar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top