If I needed to output lots of debug data in (semi) realtime, I wouldn't bother with a serial UART. I'd use something like Segger's RTT.
https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/
Like when you develop a sensors-fusion algorithm (IMU, for example) and you have fours sensors streaming data and you need to catch what's going wrong realtime.
Sometimes you are just lucky and there is some trick.
Like when I had to develop a seismic sensor, and since it was not practically possible, neither it made sense, to be install sensor on a rock face just to collect data streams, I chose to produce a kind of "synthetic" stream by sampling data on breaking some blocks of cement mortar.
Then I used the "synthetic" stream to test my algorithm. And it also opened doors to the so called "equivalent time" testing.
I was a student, no money for a DSO, LA ... and printfs and puts were just too slow. But not so slow in the "equivalent time" environment.