Na minha época, não tínhamos proteção de memória e todos aqueles negócios esquisitos! Usamos o printf para determinar onde estávamos no programa e gostamos !
Embora com toda a seriedade, geralmente significava que éramos mais cuidadosos. Onde o malloc é chamado, era necessário haver um local gratuito em algum outro lugar do programa, e essa verificação era rigorosa porque, no caso de um problema, como você claramente apontou, as falhas de segmentação não são erros úteis.
No caso de tais erros, o melhor que você pode fazer é tentar entender quando essas falhas de segmentação ocorrem (usando printf) e, observando o código, determinar por que o acesso à memória naquele momento não era válido e trabalhar a partir daí.
Essencialmente, o mesmo acontece hoje, exceto que usamos depuradores para determinar quando os erros ocorrem, mas você ainda precisa entender por que isso aconteceu, e nem sempre é tão simples quanto encontrar a linha na qual o erro ocorreu. Erros causam erros como uma reação em cadeia e, se você fosse um programador C naquela época, passava 20% do seu tempo codificando e o restante do tempo arrancando os cabelos para corrigir bugs.