Janelas console de registro de arquivo perde fim da cauda se a aplicação deixa de funcionar; como ver fim da cauda?

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

Pergunta

Nós construímos complicadas ferramentas baseado em console que produzem um monte de comentários sobre o console. Estas ferramentas processar uma grande quantidade de dados e assim por corridas são caros e nós não gostamos de fazê-las com mais freqüência do que o necessário, especialmente durante os testes onde já temos para executá-los repetidamente. Durante esses testes, que muitas vezes registrar o resultado para um arquivo para capturar este comentário para inspeção: C:> [ourcommand]> log.txt Quando o aplicativo é executado para conclusão, isso funciona muito bem.

Se o aplicativo falha (referência de memória ilegal, etc.), Windows nastily corta o arquivo de log antes do fim da cauda do comentário por isso não podemos ver o que estava ocorrendo no momento do acidente. Ele também corta da saída do console no mesmo lugar. Então, quando temos um arquivo de log truncado, temos que fazer tudo de novo sem o arquivo de log, para ver a resposta final. O Windows não parece tamponar a saída do console se não registrando.

Existe uma maneira de dizer o Windows não para tamponar a saída do console, enquanto o registo? Nosso aplicativo usa o sistema de execução (Windows) C e algum tempo atrás nós usamos "setvbuf" do seguinte modo: setvbuf (saída padrão, NULL, _IONBF, 0); mas sem sucesso.

Foi útil?

Solução

Você pode liberar o buffer da consola em qualquer ponto:

Console.Out.Flush();

Isto usa TextWriter.Flush () .

Se você precisa ter certeza isso sempre acontece, seria bastante fácil de escrever um método para o console que funcionou como WriteLine mas incluía uma declaração de descarga no final.


Editar:

Você não especificou uma linguagem ... Eu vou escrever um exemplo usando C #.

Em C #, você pode facilmente fazer uma classe de utilitário estático que proporciona um 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
}

Em seguida, basta ligar para:

FlushingConsole.WriteLine(....);

A mesma abordagem deve funcionar em praticamente qualquer outra língua, também.


Edit 2:

Uma vez que você estiver usando C ++, há um par de outras opções do que setvbuf que podem ser do seu interesse.

Primeiro, você deve ser capaz de desligar o buffer em cout fazendo:

cout.unsetf(ios_base::unitbuf);

Você também pode precisar definir sync_with_stdio se você está misturando stdio. (ie: printf) com iostreams

Outras dicas

Você não especificou linguagem, mas para C ++, você deve ser capaz de chamar setvbuf com stdout como o primeiro parâmetro para desligar buffering.

Você está aparentemente usando saída padrão. É melhor usar o "erro padrão". (Stderr em C biblioteca, cerr em iostreams) Aqueles que não são tamponados. Ou você pode usar FlushFileBuffers (ou analógico), cada vez que você deseja sincronizar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top