| Preface | p. xxi |
| Why I Wrote This Book | p. xxi |
| Who Should Read This Book | p. xxi |
| How to Read This Book | p. xxii |
| Typographical and Grammatical Conventions | p. xxiii |
| Acknowledgments | p. xxiii |
| Permissions | p. xxiv |
| Introduction | p. 1 |
| The nature of the problem | p. 1 |
| The six ways of thinking | p. 2 |
| The two eras of software engineering | p. 4 |
| Debugging and development methodologies | p. 8 |
| Review | p. 12 |
| Sherlock Holmes | p. 15 |
| Preview | p. 15 |
| Worldview of the detective | p. 15 |
| Detective fiction | p. 16 |
| The character of Sherlock Holmes | p. 17 |
| The methods of Sherlock Holmes | p. 18 |
| Review | p. 31 |
| Lord Peter Wimsey | p. 33 |
| Preview | p. 33 |
| The character of Lord Peter Wimsey | p. 33 |
| The methods of Lord Peter Wimsey | p. 35 |
| Review | p. 47 |
| Professor Solomon | p. 49 |
| Preview | p. 49 |
| The methods of Professor Solomon | p. 49 |
| Review | p. 60 |
| Case Studies 1 | p. 63 |
| Case Study 1 | p. 63 |
| Mathematical Problem Solving | p. 175 |
| Preview | p. 175 |
| Worldview of the mathematician | p. 176 |
| Polya and mathematical heuristics | p. 176 |
| Mathematical proof texts | p. 179 |
| Schoenfeld and mathematical problem solving | p. 182 |
| Applying Schoenfeld to debugging | p. 185 |
| Review | p. 187 |
| Debugging Strategies | p. 189 |
| Preview | p. 189 |
| Evaluation mechanisms | p. 189 |
| Binary search strategy | p. 190 |
| Greedy search strategy | p. 191 |
| Breadth-first search strategy | p. 192 |
| Depth-first search strategy | p. 193 |
| Program slice strategy | p. 195 |
| Deductive-analysis strategy | p. 196 |
| Inductive-analysis strategy | p. 196 |
| Choosing a strategy | p. 197 |
| Review | p. 199 |
| Debugging Heuristics | p. 201 |
| Preview | p. 201 |
| Stabilize the program | p. 202 |
| Create a test case | p. 203 |
| Reduce the required input | p. 207 |
| Categorize the problem | p. 208 |
| Describe the problem | p. 212 |
| Explain the problem to someone else | p. 213 |
| Recall a similar problem | p. 214 |
| Draw a diagram | p. 215 |
| Choose a hypothesis from historical data | p. 216 |
| Review | p. 217 |
| Debugging Tactics | p. 221 |
| Preview | p. 221 |
| Read the source code | p. 222 |
| Write a unit test | p. 224 |
| Display variable values | p. 225 |
| Display execution messages | p. 227 |
| Display procedure arguments | p. 230 |
| Generate a flow trace | p. 232 |
| Generate a variable snapshot | p. 233 |
| Generate memory dump | p. 234 |
| Force variable value | p. 236 |
| Assert assumptions | p. 237 |
| Check data structures | p. 239 |
| Display data structures | p. 240 |
| Use runtime subscript checking | p. 242 |
| Use runtime stack checking | p. 243 |
| Use runtime heap checking | p. 245 |
| Initialize global variables | p. 247 |
| Initialize local variables | p. 248 |
| Change storage class | p. 249 |
| Use a different compiler | p. 251 |
| Compile to assembly code | p. 252 |
| Execute on a different platform | p. 255 |
| Review | p. 256 |
| Case Studies II | p. 257 |
| Case Study 2 | p. 257 |
| Case Study 3 | p. 279 |
| The Way of the Safety Expert | p. 361 |
| Preview | p. 361 |
| Worldview of the safety expert | p. 361 |
| Root-cause analysis | p. 362 |
| Software-defect root causes | p. 363 |
| Cause-and-event charting | p. 381 |
| Fault-tree analysis | p. 382 |
| Review | p. 384 |
| The Way of the Psychologist | p. 387 |
| Preview | p. 387 |
| Worldview of the psychologist | p. 387 |
| Models of human cognition | p. 388 |
| Defining and classifying human error | p. 389 |
| Explaining error causes | p. 394 |
| Research review | p. 414 |
| Review | p. 427 |
| The Way of the Engineer | p. 433 |
| Preview | p. 433 |
| Worldview of the engineer | p. 434 |
| Classifying errors by development stage | p. 437 |
| Avoiding errors by development stage | p. 442 |
| Avoiding errors by coding conventions | p. 451 |
| Building debugging infrastructure | p. 466 |
| Review | p. 469 |
| The Way of the Computer Scientist | p. 473 |
| Preview | p. 473 |
| The worldview of the computer scientists | p. 474 |
| Classifying errors by linguistic formalism | p. 474 |
| Detecting programming errors by linguistic formalism | p. 476 |
| Static-analysis tools | p. 478 |
| Dynamic-analysis tools | p. 488 |
| Analysis comparison | p. 503 |
| Review | p. 505 |
| Get Back to Work | p. 509 |
| Review the methods | p. 509 |
| Measure your work | p. 513 |
| Visit our Web site | p. 513 |
| Glossary | p. 515 |
| Root-Cause Checklist | p. 517 |
| Design errors | p. 517 |
| Coding errors | p. 519 |
| Books about Debugging | p. 525 |
| Software Recommendations | p. 537 |
| Testing | p. 537 |
| Static and Dynamic Analysis | p. 537 |
| References | p. 539 |
| Software Development | p. 539 |
| Books about Supporting Disciplines | p. 542 |
| Index | p. 547 |
| Table of Contents provided by Ingram. All Rights Reserved. |