En mi día, no teníamos protección de memoria y todo ese negocio elegante. Usamos printf para determinar en qué parte del programa estábamos , ¡ y nos gustó !
Aunque con toda seriedad, generalmente significaba que teníamos más cuidado. Cuando se llama a malloc, tenía que haber un programa gratuito en algún otro lugar del programa, y dicha verificación fue rigurosa porque en el caso de un problema, como ha señalado claramente, las fallas de segmentación no son errores útiles.
En el caso de tales errores, lo mejor que puede hacer es tratar de comprender cuándo ocurren tales fallas de segmentación (usando printf) y, mirando el código, determinar por qué el acceso a la memoria en ese punto no era válido y trabajar hacia atrás desde allí.
En esencia, lo mismo sucede hoy, excepto que usamos depuradores para determinar cuándo ocurren los errores, pero aún debe comprender por qué sucedió, y no siempre es tan simple como encontrar la línea en la que ocurrió el error. Los errores causan errores como una reacción en cadena, y si eras un programador de C en esos días, pasabas el 20% de tu tiempo codificando y el resto del tiempo arrancándote el pelo arreglando errores.