On the client side printing is the only way.
On the server side I use PyCharm.
For apps with some serious logic, about half of them, I use test driven development, as decribed here: [Wiki] Best practices: Test-driven development with Anvil
I clone all the apps so I can apply the same theme: What's the workflow I'd need to follow in upgrading an app to MD3? - #2 by stefano.menci
Since all apps are cloned to my computer, even the simple ones that don’t need test driven development, I use PyCharm to do some testing and debugging locally: Using PyCharm for development and testing
In some cases, when development is done and the app is in production, I send myself an email that includes the traceback: How to handle unexpected disconnect in Uplink program? - #4 by stefano.menci