El motivo principal para no depurar con printf () es que generalmente es ineficiente, inadecuado e innecesario.
Ineficiente: printf () y los parientes usan una gran cantidad de flash y RAM en relación con lo que está disponible en un pequeño microcontrolador, pero la mayor ineficiencia se encuentra en la depuración real. Cambiar lo que se está registrando requiere volver a compilar y reprogramar el objetivo, lo que ralentiza el proceso. También utiliza un UART que de otro modo podría estar usando para hacer un trabajo útil.
Inadecuado: solo hay tantos detalles que puede generar a través de un enlace serial. Si el programa se cuelga, no sabe exactamente dónde, solo la última salida que se completó.
No es necesario: muchos microcontroladores se pueden depurar remotamente. JTAG o los protocolos propietarios se pueden usar para pausar el procesador, echar un vistazo a los registros y la RAM, e incluso alterar el estado del procesador en ejecución sin tener que recompilarlo. Esta es la razón por la que los depuradores son generalmente una mejor forma de depurar que las declaraciones impresas, incluso en una PC con mucho espacio y poder.
Es desafortunado que la plataforma de microcontroladores más común para los novatos, Arduino, no tenga un depurador. El AVR admite la depuración remota, pero el protocolo debugWIRE de Atmel es propietario y no está documentado. Puedes usar un tablero de desarrollo oficial para depurar con GDB, pero si lo tienes, probablemente ya no estés demasiado preocupado por Arduino.