Debugging is hard. There are many things we do to make it easier on ourselves.
- Feature-level things like building tracing and logging capabilities.
- Design-level things like having clear points at which state is checked for consistency (internal or parameters passed in, for example), so we narrow down the areas where things might have gone wrong.
- Code-level things like making sure that exceptions bubble up without losing the stack.
- Operational-level things like using tools to capture dumps on failure and monitoring performance counters, to have good data about the program and its environment.
John Robbins has a great post about build-time and environment-setup-time things you can do to make your debugging life easier, and PDB files are a big part of it. If you haven't debugged symbol-indexed and source-indexed programs in the past, you're in for a treat.