pregunta fallo de segmentación
-
19-09-2019 - |
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í?
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.
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.