Draft table of contents
Part 1: Foundations
* Introduction (embracing debugging as both a first-class part of our jobs as engineers, and as an enjoyable, rewarding part of the craft of software engineering)
* How software fails: taxonomy of failure (implicit and explicit, fatal and non-fatal)
* Understanding software failure: the scientific method (including the roles of reproducibility, for testing hypotheses and gathering data)
Part 2: Approaches
* In situ debugging
-- Using Dynamic Tracing --Logging
-- Basic tools (e.g., finding information about what processes are doing?)
* Postmortem debugging (fatal failure)
Part 3: Specific expertise
These chapters start with narrative prose describing basic concepts, and then enumerate tips and techniques related to the problem space.
* Debugging memory issues in native code (corruption, use-after-free)
* Debugging resource exhaustion in native code
* Debugging multi-threaded programs
* Debugging in dynamic environments (including GC-related issues)
* Debugging the network (including TCP issues, jumbo frames, partitions)
* Debugging distributed systems
* Debugging performance issues
* Debugging psychotic issues
Part 4: Advanced topics
* Debugging-driven development (embracing debugging at development-time)
* What to do when you're stuck
* Debugging unfamiliar systems
* Debugging during an outage
* Building an organization for debugging
* Describing failure [rigorously, and the importance of it]