Step 3 and 4 (use asserts and logging) are also pretty great, but with a debugger, you can do nonce asserts and observations as you trace through the code rather than trying to guess at the beginning of every compile cycle what needs to be asserted or logged. If you want to assert and log everything a debugger might catch, you're just insane. I'm not logging every state change as it happens.
Step 2, 5, and 6 are refactoring, unit testing, and code review. I am all for them, but they don't always solve the same problem as debugging. I'd rather give up debugging than give up refactoring, unit testing, and code review, but no one says you have to.