A razão maior para não depurar com printf () é que geralmente é ineficiente, inadequado e desnecessário.
Ineficiente: printf () e parentes usam muito flash e RAM em relação ao que está disponível em um pequeno microcontrolador, mas a maior ineficiência está na depuração real. Alterar o que está sendo registrado requer recompilar e reprogramar o destino, o que atrasa o processo. Ele também usa um UART que você poderia estar usando para realizar um trabalho útil.
Inadequado: há tantos detalhes que você pode enviar através de um link serial. Se o programa travar, você não sabe exatamente onde, apenas a última saída concluída.
Desnecessário: Muitos microcontroladores podem ser depurados remotamente. JTAG ou protocolos proprietários podem ser usados para pausar o processador, espiar registros e RAM e até alterar o estado do processador em execução sem precisar recompilar. É por isso que os depuradores são geralmente uma maneira melhor de depurar do que as instruções de impressão, mesmo em um PC com muito espaço e energia.
É lamentável que a plataforma de microcontrolador mais comum para iniciantes, o Arduino, não tenha um depurador. O AVR suporta depuração remota, mas o protocolo debugWIRE da Atmel é proprietário e não documentado. Você pode usar uma placa de desenvolvedor oficial para depurar com o GDB, mas se tiver, provavelmente não está mais preocupado com o Arduino.