Frage

Recht, wenn ich bei fflush (stdout) und breche ich dort in GDB, kann ich wissen, was es in stdout, bevor ich es tatsächlich drucken?

Wie kann ich wissen, was in stdout dort zu jedem Zeitpunkt ist?

War es hilfreich?

Lösung

Sie können fast sicher, aber man sollte wahrscheinlich nicht. Der Standard verlangt nur, dass FILE ein Typ sein, der für die Umsetzung nützlich ist, eine geöffnete Datei zu identifizieren und was Staat benötigt, um die Semantik der verschiedenen Funktionen zu implementieren, die auf Strömen arbeiten.

Ich würde im Allgemeinen stimme mit dem anderen Plakaten, dass fflush() eine zuverlässige Art und Weise zu wissen, was Sie tatsächlich in die Datei geschrieben.

Wenn Sie jedoch den Überblick verloren haben, welche Teile des Codes könnte in einen Stream schreiben, dann kann es gelegentlich nützlich sein, um den Strom in Aktion zu sehen und fangen sie zu verändern.

In der Praxis ist FILE ein typedef für eine struct, die von der Implementierung in der Header-Datei stdio.h deklariert wird (häufig genannt struct _iobuf). Obwohl eine typische Implementierung nur leicht seinen Mitgliedern dokumentiert, auch eine typische Implementierung implementiert putchar() und einige seiner Freunde als Makros, die auch in stdio.h zu finden sind. Das, kombiniert mit der voraussichtlichen Verfügbarkeit von Quellen für die C-Laufzeitbibliothek jeder Werkzeugkette sind Sie wahrscheinlich mit gdb zu verwenden, bekommt man alle Informationen, die Sie unter der Haube zu spähen müssen.

Die stdio.h vorgesehen in MinGW GCC 3.4.5 implementiert FILE wie folgt:

typedef struct _iobuf
{
    char*   _ptr;
    int _cnt;
    char*   _base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char*   _tmpfname;
} FILE;

// oversimplify declaration of _iob[] here for clarity:
extern FILE _iob[FOPEN_MAX];    /* An array of FILE imported from DLL. */
//...
#define STDIN_FILENO    0
#define STDOUT_FILENO   1
#define STDERR_FILENO   2
#define stdin   (&_iob[STDIN_FILENO])
#define stdout  (&_iob[STDOUT_FILENO])
#define stderr  (&_iob[STDERR_FILENO])

und Geräte putchar() als Inline-Funktion Vorteil einer GCC-Erweiterung zu C unter:

__CRT_INLINE int __cdecl __MINGW_NOTHROW putchar(int __c)
{
  return (--stdout->_cnt >= 0)
    ?  (int) (unsigned char) (*stdout->_ptr++ = (char)__c)
    :  _flsbuf (__c, stdout);}

Aus dieser kann man sagen, dass das Ende des Puffers von dem Mitglied _ptr spitzer ist, und daraus schließen, dass der einzige andere char * in struct _iobuf (_base) zeigt auf den Anfang des Puffers. Das Mitglied _cnt ist eindeutig die Anzahl der nicht verwendeten Zeichen im Puffer verbleiben. Die Funktion _flsbuf() muss das erste Zeichen nehmen, die nicht und es passten am Anfang des Puffers gesetzt, nachdem er den aktuellen Pufferinhalt in die Datei geschrieben und wieder das _cnt Feld.

Wenn Sie also stdout->_base beobachten und BUFSIZ - stdout->_cnt Sie würde für diese Implementierung, hat eine Anzeige, wie viel und was in dem aktuellen Puffer ist.

Andere Tipps

Wenn Sie einen Puffer selbst zuweisen und übergeben es an setvbuf , ich nehme an Dich zugreifen kann es vor einem Flush, da Ihr es ist zu beginnen.

EDIT: Ihr Kommentar gemacht Ihre Absicht mehr klar, aber was Sie wollen wird nicht einfach sein:

  1. Richten Sie Ihren eigenen Puffer, wie oben beschrieben,
  2. Stellen Sie einen Beobachtungspunkt auf stdout lesen,
  3. Achten Sie auf Ihr Programm langsam zu einem Schleichen.

Von da an gdb wird jedes Mal brechen alles Zugriffe stdout, und Sie können Ihre Puffer für Änderungen, seltsame Ausgabe usw. überprüfen.

sagte, dass, das ist keine ideale Lösung überhaupt. Ein weitaus besserer Ansatz wäre eine Logging-fähige Ausgabefunktion überall in Ihrem Code verwenden.

Ich denke, es ist besser, bündig stdout, welche Mittel im Grunde Sie den Inhalt auf dem Bildschirm zu sehen oder in einer Datei (wenn stdout umgeleitet wird).

use „setbuf ()“ und hält einen Griff an den Puffer, die Sie bei Peek können. Leider, ich weiß die Spitze nicht aus, wie die Offset und Länge von unflushed Daten zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top