Pregunta

Justo cuando estoy en el fflush (stdout) y rompo allí en GDB, puedo saber lo que hay en la salida estándar antes de que realmente imprimo?

¿Cómo puedo saber lo que hay en la salida estándar en cualquier punto en el tiempo?

¿Fue útil?

Solución

es casi seguro que se puede, pero es probable que no debería. La norma requiere solamente que FILE ser un tipo que es útil para la puesta en práctica de identificar un archivo abierto y cualquiera que sea el estado está obligado a aplicar la semántica de las diversas funciones que operan sobre las corrientes.

Yo por lo general estaría de acuerdo con otros críticos que fflush() es una manera segura de saber lo que realmente escribió en el fichero.

Sin embargo, si usted tiene la pista perdida de qué partes de su código podría estar escribiendo a una corriente, entonces se puede en ocasiones ser útil para ver el funcionamiento en acción y cogerlo cambiante.

En la práctica, FILE es un typedef para un struct declarado por su aplicación en el archivo de cabecera stdio.h (a menudo llamado struct _iobuf). Aunque una implementación típica documentos sólo ligeramente sus miembros, una implementación típica también implementa putchar() y algunos de sus amigos como macros que también se encuentran en stdio.h. Eso, combinado con la probable disponibilidad de fuentes de la biblioteca de tiempo de ejecución C de cualquier cadena de herramientas es probable que se utilizará con GDB, que recibe toda la información que necesita para echar un vistazo bajo el capó.

El stdio.h proporcionado en MinGW GCC 3.4.5 implementos FILE como sigue:

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])

e implementos putchar() como una función en línea aprovechando una extensión GCC a C:

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

A partir de esto se puede decir que el final del búfer es apuntado por el miembro de _ptr, e inferir que la única otra char * en struct _iobuf (_base) está apuntando al principio del búfer. El miembro de _cnt es claramente el recuento de caracteres no utilizados que quedan en la memoria intermedia. El _flsbuf() función debe tomar el primer carácter que no encajaba y se lo puso en el comienzo de la memoria intermedia después de que escribió el contenido del buffer actual al archivo y restauró el campo _cnt.

Por lo tanto, si usted mira stdout->_base y BUFSIZ - stdout->_cnt que sería, para esta aplicación, tiene una pantalla de cuánto y qué hay en el búfer en uso.

Otros consejos

Si asigna un búfer de sí mismo y lo pasa a setvbuf , te suponga se puede acceder a ella antes de un color, ya que es el suyo, para empezar.

EDIT: Su comentario hizo su intento más claro, pero lo que quiere no será fácil:

  1. Configure su propio buffer como se describió anteriormente,
  2. Establecer un leer punto de observación en stdout,
  3. Mire su programa de lento a paso de tortuga.

A partir de entonces, gdb romperá cada vez lo accesos stdout, y se puede comprobar su búfer de salida, cambios raro, etc.

Una vez dicho esto, que no es una solución ideal en absoluto. Un enfoque mucho mejor sería utilizar una función de salida de registro habilitados en todas partes de su código.

Creo que es mejor stdout ras, que básicamente significa que está viendo el contenido de la pantalla o en un archivo (si se redirige stdout).

uso "setbuf ()", y tener un identificador de la memoria intermedia, que se puede echar un vistazo al. Por desgracia, no sé de la parte superior de cómo encontrar el desplazamiento y la longitud de los datos volcados.

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