Ci sono alcuni modi.
Quello che stai usando è una forma rudimentale di logging . È probabilmente il modo più efficiente in termini di tempo per eseguire il debug della maggior parte degli errori. Vale la pena dedicare tempo a scrivere un modulo di registrazione solido che può essere reindirizzato allo schermo o al file, bufferizzato / non bufferizzato, ecc. Dovrebbe avere un timestamp e un messaggio, se non altro.
Ci sono anche eccezioni di lancio - questo può essere più utile con le lingue che eseguono una traccia di stack usando simboli, ad esempio Java o Python. Perl può gracidare () o morire () con informazioni altrettanto utili.
Un altro metodo sta avendo una vasta gamma di test unitari in grado di raccogliere errori in modo raffinato. Ciò ovviamente implica test ben scritti.
Quanto sopra sono essenzialmente metodi non interattivi.
Esiste anche Ye Old Interactive Debugger, che funziona in vari livelli di utilità a seconda dell'ambiente di sviluppo. Probabilmente Lisp dispone delle migliori funzioni di debug disponibili; C # ha probabilmente l'interfaccia utente più sviluppata. I debugger interattivi possono essere molto utili quando il tuo codice "logicamente" dovrebbe funzionare, e hai davvero bisogno di fare qualche serio controllo della variabile e sondare la situazione. È probabilmente il metodo più inefficiente e difficile da replicare di tutti i metodi, ma può essere davvero utile.
Il debugger interattivo può essere esteso per far sì che varie variabili e script vengano eseguiti su variabili che raggiungono valori, ma non sono sicuro che gli ambienti correnti lo supportino - l'ultimo che ho sentito è stato sviluppato nel '93 per ... Prolog ? Non riesco a ricordare la parte superiore della mia testa.
Un metodo che è stato studiato nei primi anni '80 e che sta avendo un ritorno minore oggi è rigiocabile / reverse debugging. Sto lavorando per farlo nella mia tesi per un sistema embedded altamente esotico.