Yes, if only the micro/debugger designers would have thought of something like printf, but with less performance impact and better integration with the source code. They could add hardware to the micro to accelerate this. How about they would call this real-time tracing?
I find interactive debugging occasionally useful. Sure, many bugs can be found by examining the code, or by inserting printf statements. But depending on how long the modify/compile/run cycle is (some bugs may need some external events to trigger them), it may be quicker to use an interactive debugger than to keep adding printf statements as you get closer to the problem area. Especially early when you have no idea where the problem is. Also for data structures that are not trivial to present in a readable format, like structures involving lots of pointers. Sure, you could write another problem to interpret it, but why not use the debugger to do that? Although I rarely single step, more likely run until breakpoint, examine variables, set new breakpoint, continue.