I personally have a different approach. I try to be proactive about my workflow.
Debugging when there is an error
IMO If I can't read the error message and understand the issue, I am doing something wrong.
Simplest way to do this is to not be lazy about handling errors/exceptions. I bubble up all my exceptions and errors and if for some strange reason I find a stack trace without a legit handling issue, I check the exception stack trace.
Debugging when there is a business logic mistake
TDD - There is no better tool to never make a business logic mistake. It saves a ton of time in long run. Integration Test Cases - Overall runs should yield expected results.
If for some reason a mistake escapes your notice after these two, put a debugger and inspect values at each level