I don't think I'd be anywhere near as productive without:
- Conditional breakpoints
- Debugger.Launch
- Debugger.Break
- Debugger.Write
Conditional breakpoints are essential, just run as normal and it'll only break when your bizarre edge case is hit.Debugger.Break and Debugger.Launch are like a breakpoint that gets hit even when you're not debugging, and prompts you to attach a debugger. ( Launch won't pause if you already have one attached, but especially useful when you want to attach to a start-up routine in an IIS hosted web-app. )
Debugger.Write writes to a different output stream, and like all Diagnostic.Debug statements, isn't even compiled into release builds, so there's zero chance of it ending up in prod.
These are essential tools for rapid debugging. Printing nonsense and hoping to spot it feels 20+ years out of date.