Why Programs Fail - 2nd Edition - ISBN: 9780123745156, 9780080923000

Why Programs Fail

2nd Edition

A Guide to Systematic Debugging

Authors: Andreas Zeller
eBook ISBN: 9780080923000
Paperback ISBN: 9780123745156
Imprint: Morgan Kaufmann
Published Date: 22nd July 2009
Page Count: 544
Sales tax will be calculated at check-out Price includes VAT/GST
Price includes VAT/GST
× DRM-Free

Easy - Download and start reading immediately. There’s no activation process to access eBooks; all eBooks are fully searchable, and enabled for copying, pasting, and printing.

Flexible - Read on multiple operating systems and devices. Easily read eBooks on smart phones, computers, or any eBook readers, including Kindle.

Open - Buy once, receive and download all available eBook formats, including PDF, EPUB, and Mobi (for Kindle).

Institutional Access

Secure Checkout

Personal information is secured with SSL technology.

Free Shipping

Free global shipping
No minimum order.


This book is proof that debugging has graduated from a black art to a systematic discipline. It demystifies one of the toughest aspects of software programming, showing clearly how to discover what caused software failures, and fix them with minimal muss and fuss.

The fully updated second edition includes 100+ pages of new material, including new chapters on Verifying Code, Predicting Erors, and Preventing Errors. Cutting-edge tools such as FindBUGS and AGITAR are explained, techniques from integrated environments like Jazz.net are highlighted, and all-new demos with ESC/Java and Spec#, Eclipse and Mozilla are included.

This complete and pragmatic overview of debugging is authored by Andreas Zeller, the talented researcher who developed the GNU Data Display Debugger(DDD), a tool that over 250,000 professionals use to visualize the data structures of programs while they are running. Unlike other books on debugging, Zeller's text is product agnostic, appropriate for all programming languages and skill levels.

The book explains best practices ranging from systematically tracking error reports, to observing symptoms, reproducing errors, and correcting defects. It covers a wide range of tools and techniques from hands-on observation to fully automated diagnoses, and also explores the author's innovative techniques for isolating minimal input to reproduce an error and for tracking cause and effect through a program. It even includes instructions on how to create automated debugging tools.

The text includes exercises and extensive references for further study, and a companion website with source code for all examples and additional debugging resources is available.

Key Features

*The new edition of this award-winning productivity-booster is for any developer who has ever been frustrated by elusive bugs

*Brand new chapters demonstrate cutting-edge debugging techniques and tools, enabling readers to put the latest time-saving developments to work for them

*Learn by doing. New exercises and detailed examples focus on emerging tools, languages and environments, including AGITAR, FindBUGS, Python and Eclipse.


Computer programmers, software developers, analysts and testers

Table of Contents

1 How Failures Come to Be <BR id=""CRLF"">1.1 My Program Does Not Work! <BR id=""CRLF"">1.2 From Defects to Failures <BR id=""CRLF"">1.3 Lost in Time and Space<BR id=""CRLF"">1.4 From Failures to Fixes <BR id=""CRLF"">1.5 Automated Debugging Techniques <BR id=""CRLF"">1.6 Bugs, Faults, or Defects? <BR id=""CRLF"">1.7 Concepts <BR id=""CRLF"">1.8 Tools <BR id=""CRLF"">1.9 Further Reading <BR id=""CRLF"">1.10 Exercises<BR id=""CRLF""><BR id=""CRLF"">2 Tracking Problems <BR id=""CRLF"">2.1 Oh! All These Problems <BR id=""CRLF"">2.2 Reporting Problems <BR id=""CRLF"">2.3 Managing Problems <BR id=""CRLF"">2.4 Classifying Problems <BR id=""CRLF"">2.5 Processing Problems <BR id=""CRLF"">2.6 Managing Problem Tracking <BR id=""CRLF"">2.7 Requirements as Problems <BR id=""CRLF"">2.8 Managing Duplicates <BR id=""CRLF"">2.9 Relating Problems and Fixes <BR id=""CRLF"">2.10 Relating Problems and Tests<BR id=""CRLF"">2.11 Concepts <BR id=""CRLF"">2.12 Tools <BR id=""CRLF"">2.13 Further Reading <BR id=""CRLF"">2.14 Exercises <BR id=""CRLF""><BR id=""CRLF"">3 Making Programs Fail <BR id=""CRLF"">3.1 Testing for Debugging <BR id=""CRLF"">3.2 Controlling the Program <BR id=""CRLF"">3.3 Testing at the Presentation Layer <BR id=""CRLF"">3.4 Testing at the Functionality Layer <BR id=""CRLF"">3.5 Testing at the Unit Layer <BR id=""CRLF"">3.6 Isolating Units <BR id=""CRLF"">3.7 Designing for Debugging 7<BR id=""CRLF"">3.8 Preventing Unknown Problems <BR id=""CRLF"">3.9 Concepts <BR id=""CRLF"">3.10 Tools <BR id=""CRLF"">3.11 Further Reading <BR id=""CRLF"">3.12 Exercises <BR id=""CRLF""><BR id=""CRLF"">4 Reproducing Problems <BR id=""CRLF"">4.1 The First Task in Debugging <BR id=""CRLF"">4.2 Reproducing the Problem Environment <BR id=""CRLF"">4.3 Reproducing Program Execution <BR id=""CRLF"">4.4 Reproducing System Interaction <BR id=""CRLF"">4.5 Focusing on Units <BR id=""CRLF"">4.6 Concepts <BR id=""CRLF"">4.7 Tools <BR id=""CRLF"">4.8 Further Reading <BR id=""CRLF"">4.9 Exercises <BR id=""CRLF""><BR id=""CRLF"">5 Simplifying Problems <BR id=""CRLF"">5.1 Simplifying the Problem <BR id=""CRLF"">5.2 The Gecko BugAThon <BR id=""CRLF"">5.3 Manual Simplification <BR id=""CRLF"">5.4 Automatic Simplification <BR id=""CRLF"">5.5 A Simplification Algorithm <BR id=""CRLF"">5.6 Simplifying User Interaction <BR id=""CRLF"">5.7 Random Input Simplified <BR id=""CRLF"">5.8 Simplifying Faster <BR id=""CRLF"">5.9 Concepts <BR id=""CRLF"">5.10 Tools <BR id=""CRLF"">5.11 Further Reading <BR id=""CRLF"">5.12 Exercises <BR id=""CRLF""><BR id=""CRLF"">6 Scientific Debugging <BR id=""CRLF"">6.1 How to Become a Debugging Guru <BR id=""CRLF"">6.2 The Scientific Method <BR id=""CRLF"">6.3 Applying the Scientific Method <BR id=""CRLF"">6.4 Explicit Debugging <BR id=""CRLF"">6.5 Keeping a Logbook <BR id=""CRLF"">6.6 Debugging Quick-and-Dirty <BR id=""CRLF"">6.7 Algorithmic Debugging <BR id=""CRLF"">6.8 Deriving a Hypothesis <BR id=""CRLF"">6.9 Reasoning About Programs <BR id=""CRLF"">6.10 Concepts <BR id=""CRLF"">6.11 Further Reading <BR id=""CRLF"">6.12 Exercises <BR id=""CRLF""> <BR id=""CRLF"">7 Deducing Errors <BR id=""CRLF"">7.1 Isolating Value Origins <BR id=""CRLF"">7.2 Understanding Control Flow <BR id=""CRLF"">7.3 Tracking Dependences<BR id=""CRLF"">7.4 Slicing Programs <BR id=""CRLF"">7.5 Deducing Code Smells <BR id=""CRLF"">7.6 Limits of Static Analysis <BR id=""CRLF"">7.7 Concepts <BR id=""CRLF"">7.8 Tools <BR id=""CRLF"">7.9 Further Reading <BR id=""CRLF"">7.10 Exercises <BR id=""CRLF""><BR id=""CRLF"">8 Observing Facts <BR id=""CRLF"">8.1 Observing State <BR id=""CRLF"">8.2 Logging Execution <BR id=""CRLF"">8.3 Using Debuggers <BR id=""CRLF"">8.4 Querying Events <BR id=""CRLF"">8.5 Visualizing State <BR id=""CRLF"">8.6 Concepts <BR id=""CRLF"">8.7 Tools <BR id=""CRLF"">8.8 Further Reading <BR id=""CRLF"">8.9 Exercises <BR id=""CRLF""><BR id=""CRLF"">9 Tracking Origins <BR id=""CRLF"">9.1 Reasoning Backwards <BR id=""CRLF"">9.2 Exploring Execution History <BR id=""CRLF"">9.3 Dynamic Slicing <BR id=""CRLF"">9.4 Leveraging Origins <BR id=""CRLF"">9.5 Tracking Down Infections <BR id=""CRLF"">9.6 Concepts <BR id=""CRLF"">9.7 Tools <BR id=""CRLF"">9.8 Further Reading <BR id=""CRLF"">9.9 Exercises <BR id=""CRLF""><BR id=""CRLF"">10 Asserting Expectations <BR id=""CRLF"">10.1 Automating Observation <BR id=""CRLF"">10.2 Basic Assertions <BR id=""CRLF"">10.3 Asserting Invariants <BR id=""CRLF"">10.4 Asserting Correctness <BR id=""CRLF"">10.5 Assertions as Specifications <BR id=""CRLF"">10.6 From Assertions to Verification <BR id=""CRLF"">10.7 Reference Runs <BR id=""CRLF"">10.8 System Assertions <BR id=""CRLF"">10.9 Checking Production Code <BR id=""CRLF"">10.10 Concepts <BR id=""CRLF"">10.11 Tools <BR id=""CRLF"">10.12 Further Reading <BR id=""CRLF"">10.13 Exercises <BR id=""CRLF""><BR id=""CRLF"">11 Detecting Anomalies <BR id=""CRLF"">11.1 Capturing Normal Behavior <BR id=""CRLF"">11.2 Comparing Coverage <BR id=""CRLF"">11.3 Statistical Debugging <BR id=""CRLF"">11.4 Collecting Data in the Field<BR id=""CRLF"">11.5 Dynamic Invariants <BR id=""CRLF"">11.6 Invariants on the Fly <BR id=""CRLF"">11.7 From Anomalies to Defects<BR id=""CRLF"">11.8 Concepts <BR id=""CRLF"">11.9 Tools <BR id=""CRLF"">11.10 Further Reading <BR id=""CRLF"">11.11 Exercises<BR id=""CRLF""><BR id=""CRLF"">12 Causes and Effects <BR id=""CRLF"">12.1 Causes and Alternate Worlds<BR id=""CRLF"">12.2 Verifying Causes <BR id=""CRLF"">12.3 Causality in Practice <BR id=""CRLF"">12.4 Finding Actual Causes <BR id=""CRLF"">12.5 Narrowing Down Causes <BR id=""CRLF"">12.6 A Narrowing Example <BR id=""CRLF"">12.7 The Common Context <BR id=""CRLF"">12.8 Causes in Debugging <BR id=""CRLF"">12.9 Concepts <BR id=""CRLF"">12.10 Further Reading <BR id=""CRLF"">12.11 Exercises <BR id=""CRLF""><BR id=""CRLF"">13 Isolating Failure Causes <BR id=""CRLF"">13.1 Isolating Causes Automatically <BR id=""CRLF"">13.2 Isolating versus Simplifying <BR id=""CRLF"">13.3 An Isolation Algorithm <BR id=""CRLF"">13.4 Implementing Isolation <BR id=""CRLF"">13.5 Isolating Failure-inducing Input <BR id=""CRLF"">13.6 Isolating Failure-inducing Schedules <BR id=""CRLF"">13.7 Isolating Failure-inducing Changes <BR id=""CRLF"">13.8 Problems and Limitations <BR id=""CRLF"">13.9 Concepts <BR id=""CRLF"">13.10 Tools <BR id=""CRLF"">13.11 Further Reading <BR id=""CRLF"">13.12 Exercises <BR id=""CRLF""><BR id=""CRLF"">14 Isolating Cause-Effect Chains <BR id=""CRLF"">14.1 Useless Causes <BR id=""CRLF"">14.2 Capturing Program States <BR id=""CRLF"">14.3 Comparing Program States <BR id=""CRLF"">14.4 Isolating Relevant Program States <BR id=""CRLF"">14.5 Isolating Cause-Effect Chains <BR id=""CRLF"">14.6 Isolating Failure-inducing Code <BR id=""CRLF"">14.7 Issues and Risks <BR id=""CRLF"">14.8 Concepts <BR id=""CRLF"">14.9 Tools <BR id=""CRLF"">14.10 Further Reading <BR id=""CRLF"">14.11 Exercises <BR id=""CRLF""> <BR id=""CRLF"">15 Fixing the Defect <BR id=""CRLF"">15.1 Locating the Defect <BR id=""CRLF"">15.2 Focusing on the Most Likely Errors <BR id=""CRLF"">15.3 Validating the Defect <BR id=""CRLF"">15.4 Correcting the Defect <BR id=""CRLF"">15.5 Workarounds <BR id=""CRLF"">15.6 Learning from Mistakes <BR id=""CRLF"">15.7 Concepts <BR id=""CRLF"">15.8 Further Reading <BR id=""CRLF"">15.9 Exercises<BR id=""CRLF""><BR id=""CRLF"">Appendix: Formal Definitions <BR id=""CRLF"">A.1 Delta Debugging <BR id=""CRLF"">A.2 Memory Graphs <BR id=""CRLF"">A.3 Cause-Effect Chains


No. of pages:
© Morgan Kaufmann 2009
Morgan Kaufmann
eBook ISBN:
Paperback ISBN:

About the Author

Andreas Zeller

Andreas Zeller is a full professor for Software Engineering at Saarland University in Saarbruecken, Germany. His research concerns the analysis of large software systems and their development process; his students are funded by companies like Google, Microsoft, or SAP. In 2010, Zeller was inducted as Fellow of the ACM for his contributions to automated debugging and mining software archives. In 2011, he received an ERC Advanced Grant, Europe's highest and most prestigious individual research grant, for work on specification mining and test case generation. His book "Why programs fail", the "standard reference on debugging", obtained the 2006 Software Development Jolt Productivity Award.

Affiliations and Expertise

Saarland University, Saarbruecken, Germany


Praise from the experts for the first edition: "In this book, Andreas Zeller does an excellent job introducing useful debugging techniques and tools invented in both academia and industry. The book is easy to read and actually very fun as well. It will not only help you discover a new perspective on debugging, but it will also teach you some fundamental static and dynamic program analysis techniques in plain language." -Miryung Kim, Software Developer, Motorola Korea "Today every computer program written is also debugged, but debugging is not a widely studied or taught skill. Few books beyond this one present a systematic approach to finding and fixing programming errors." -James Larus, Microsoft Research "From the author of ODD, the famous data display debugger, now comes the definitive book on debugging. Zeller's book is chock-full with advice, insight, and tools to track down defects in programs, for all levels of experience and any programming language. The book is lucidly written, explaining the principles of every technique without boring the reader with minutiae. And best of all, at the end of each chapter it tells you where to download all those fancy tools. A great book for the software professional as well as the student interested in the frontiers of automated debugging." -Walter F. Tichy, Professor, University Karlsruhe, Germany "Andreas Zeller's Why Programs Fail lays an excellent foundation far practitioners, educators, and researchers alike. Using a disciplined approach based on the scientific method, Zeller provides deep insights, detailed approaches, and illustrative examples." -David Notkin, Professor Computer Science & Engineering, University of Washington

Ratings and Reviews