La razón más importante para no depurar con printf () es que generalmente es ineficiente, inadecuado e innecesario.
Ineficiente: printf () y sus familiares usan mucho flash y RAM en relación con lo que está disponible en un microcontrolador pequeño, pero la mayor ineficiencia está 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 usa 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 en serie. Si el programa se cuelga, no sabes exactamente dónde, solo la última salida que se completó.
Innecesario: muchos microcontroladores se pueden depurar de forma remota. Se pueden usar protocolos JTAG o patentados 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 volver a compilar. Esta es la razón por la cual los depuradores son generalmente una mejor manera de depurar que imprimir declaraciones, incluso en una PC con toneladas de espacio y potencia.
Es lamentable 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 e indocumentado. Puede usar una placa de desarrollo oficial para depurar con GDB, pero si lo tiene, probablemente ya no esté demasiado preocupado por Arduino.