Finestre registrazione della console in un file perde coda se crash dell'applicazione; come vedere coda?

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

Domanda

Costruiamo strumenti basate su console complicate che producono un sacco di commenti sulla console. Questi strumenti di processo un sacco di dati e così piste sono costosi e non ci piace fare loro più spesso di quanto necessario, soprattutto durante i test dove abbiamo già per eseguirli più volte. Durante questi test, abbiamo spesso registriamo il risultato in un file per acquisire questo commento per l'ispezione:        C:> [ourcommand]> log.txt Quando l'applicazione viene eseguita fino al completamento, questo funziona alla grande.

Se l'applicazione si blocca (riferimento di memoria illegale, ecc), Windows braciole cattiveria fuori il file di registro prima della fine di coda del commento quindi non possiamo vedere cosa stava accadendo nel punto dello schianto. Sminuzza anche l'output della console nello stesso luogo. Così, quando si ottiene un file di log troncato, dobbiamo fare tutto di nuovo senza il file di registro, per vedere la risposta finale. Windows non sembra tamponare l'uscita della console, se non la registrazione.

C'è un modo per dire a Windows di non tamponare l'output della console durante la registrazione? La nostra applicazione fa uso del sistema di runtime (Windows) C e un po 'indietro abbiamo usato "setvbuf" come segue:       setvbuf (stdout, NULL, _IONBF, 0); ma senza alcun risultato.

È stato utile?

Soluzione

È possibile svuotare il buffer della console in qualsiasi punto:

Console.Out.Flush();

Questo utilizza TextWriter.Flush () .

Se è necessario assicurarsi che questo accade sempre, sarebbe abbastanza facile da scrivere un metodo per la console che ha funzionato come WriteLine ma comprendeva una dichiarazione a filo alla fine.


Modifica:

Non hai specificato una lingua ... Ho intenzione di scrivere un esempio utilizzando C #.

In C #, si potrebbe facilmente fare una classe di utilità statica che ha fornito un metodo come:

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
}

Poi basta chiamare:

FlushingConsole.WriteLine(....);

Lo stesso approccio dovrebbe funzionare in praticamente qualsiasi altra lingua, pure.


Modifica 2:

Visto che siete in C ++, ci sono un paio di opzioni diverse da setvbuf che ti potrebbero interessare.

In primo luogo, si dovrebbe essere in grado di spegnere il buffer in cout facendo:

cout.unsetf(ios_base::unitbuf);

È inoltre potrebbe essere necessario impostare sync_with_stdio se si sta mescolando stdio. (es: printf) con iostreams

Altri suggerimenti

Non è stato specificato il linguaggio, ma per C ++ si dovrebbe essere in grado di chiamare setvbuf con stdout come il primo parametro per disattivare il buffering.

Si apparentemente utilizza standard output. È meglio utilizzare "standard error". (Stderr in libreria C, cerr in iostreams) Quelli non sono tamponata. Oppure è possibile utilizzare FlushFileBuffers (o analogico), ogni volta che si desidera sincronizzare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top