Pregunta

He observado que a veces en los programas de C, si tenemos un código de printf en cualquier lugar antes de que un fallo de segmentación, no se imprime. ¿Por qué es esto así?

¿Fue útil?

Solución

Es porque la salida de printf() es amortiguada. Se podría añadir fflush(stdout); inmediatamente después de su printf y se imprimiría.

También se podría hacer esto:

fprintf(stderr, "error string");

stderr ya no es amortiguada.

También hay una pregunta relacionada .

Otros consejos

Si el fallo de segmentación se produce demasiado pronto después de un printf, y el búfer de salida no se inundó, no podrá ver el efecto de la printf.

La mayoría de las implementaciones de libc de salida printf búfer. Por lo general es suficiente para añadir nueva línea (\ n) a la cadena de salida para obligarla a vaciar los contenidos tampones.

Puede vaciar el búfer de salida justo después de la printf para asegurar que va a ocurrir antes de una falla seg. P.ej. fflush (stdout)

punta aleatoria: si usted está tratando de depurar fallos de segmentación, no deje de probar valgrind . Esto hace que sea mucho más fácil!

Te han dado una serie de respuestas que precisan de amortiguación de la corriente de salida.

Para mejor o peor, eso es en ninguna parte cerca de la única posibilidad embargo. Un fallo de segmentación significa que el sistema operativo ha detectado que usted ha hecho algo mal, normalmente por escrito a cabo fuera de la memoria asignada. Para mejor o peor (en su mayoría peor) hacer casi lo en tal situación puede cambiar bastante de lo que hace el programa internamente para evitar que el problema sea detectado, al menos en el momento / en la situación en la que se fue detectado anteriormente.

Por ejemplo, la falla segmento puede haber sido causado por escrito a través de un puntero no inicializado - que pasó a ocupar un determinado valor (tal vez alguna pequeña entera), ya una función hubieras llamado previamente dejó que el valor en el lugar correcto en el la pila que cuando la función más tarde fue llamado, y utiliza el mismo valor como un puntero, que (razonablemente fiable) contenía un valor del sistema operativo detectado como un lugar al que no se permitió a escribir. Poner en una llamada a printf, sin embargo, podría significar que estás dejando algo de valor completamente diferente en el lugar en la pila que está utilizando sin inicialización. Todavía se está escribiendo en algún lugar que no debería, pero ahora podría ser en alguna parte que el sistema operativo no sabe que no debe ser escrito.

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