Ai tempi della mia vita, non avevamo la protezione della memoria e tutto il nostro entusiasmante business! Abbiamo usato printf per determinare dove eravamo nel programma, e ci è piaciuto !
Anche se in tutta serietà, di solito significava che eravamo solo più attenti. Dove si chiama malloc, ci doveva essere un free altrove nel programma, e tale controllo era rigoroso perché nel caso di un problema, come hai chiaramente sottolineato, gli errori di segmentazione non sono errori utili.
Nel caso di tali errori, il meglio che si possa fare è cercare di capire quando tali errori di segmentazione si verificano (usando printf) e, guardando il codice, determinare il motivo dell'accesso alla memoria in quel punto non era valido e funziona a ritroso da lì.
In sostanza, oggi accade la stessa cosa, tranne che usiamo i debugger per determinare quando si verificano errori, ma devi ancora capire perché è successo, e non è sempre così semplice come trovare il linea in cui si è verificato l'errore. Gli errori causano errori come una reazione a catena, e se tu fossi un programmatore C in quei giorni, hai passato il 20% del tuo tempo a programmare e il resto del tempo a tirare fuori i tuoi capelli fissando bug.