Why programs fail
Subtitle: a guide to systematic debugging
By: Andreas Zeller.
Edition: 2nd ed.
Publisher: Elsevier/Morgan Kaufmann
Published: 2009
Place of publication: Amsterdam; Boston
Language: eng
Number of pages: 400
ISBN-13: 9780123745156
Subjects: Debugging in computer science
Notes: Includes bibliographical references (p. 381-389) and index.
Table of contents: title: Foreword
pagenum: xv; title: Preface
pagenum: xvii; label: Chapter 1
title: How Failures Come to Be
pagenum: 1; label: 1.1
title: My Program Does Not Work!
pagenum: 1; label: 1.2
title: From Defects to Failures
pagenum: 2; label: 1.3
title: Lost in Time and Space
pagenum: 5; label: 1.4
title: From Failures to Fixes
pagenum: 8; label: 1.4.1
title: Track the Problem
pagenum: 8; label: 1.4.2
title: Reproduce the Failure
pagenum: 9; label: 1.4.3
title: Automate and Simplify the Test Case
pagenum: 9; label: 1.4.4
title: Find Possible Infection Origins
pagenum: 9; label: 1.4.5
title: Focus on the Most Likely Origins
pagenum: 12; label: 1.4.6
title: Isolate the Origin of the Infection
pagenum: 12; label: 1.4.7
title: Correct the Defect
pagenum: 13; label: 1.5
title: Automated Debugging Techniques
pagenum: 14; label: 1.6
title: Bugs, Faults, or Defects?
pagenum: 18; label: 1.7
title: Concepts
pagenum: 19; title: How to debug a program
pagenum: 20; label: 1.8
title: Tools
pagenum: 20; label: 1.9
title: Further Reading
pagenum: 21; title: Exercises
pagenum: 22; label: Chapter 2
title: Tracking Problems
pagenum: 25; label: 2.1
title: Oh! All These Problems
pagenum: 25; label: 2.2
title: Reporting Problems
pagenum: 26; label: 2.2.1
title: Problem Facts
pagenum: 26; label: 2.2.2
title: Product Facts
pagenum: 28; label: 2.2.3
title: Querying Facts Automatically
pagenum: 29; label: 2.3
title: Managing Problems
pagenum: 31; label: 2.4
title: Classifying Problems
pagenum: 32; label: 2.4.1
title: Severity
pagenum: 33; label: 2.4.2
title: Priority
pagenum: 33; label: 2.4.3
title: Identifier
pagenum: 33; label: 2.4.4
title: Comments
pagenum: 34; label: 2.4.5
title: Notification
pagenum: 34; label: 2.5
title: Processing Problems
pagenum: 34; label: 2.6
title: Managing Problem Tracking
pagenum: 36; label: 2.7
title: Requirements as Problems
pagenum: 37; label: 2.8
title: Managing Duplicates
pagenum: 39; label: 2.9
title: Relating Problems and Fixes
pagenum: 40; label: 2.10
title: Relating Problems and Tests
pagenum: 43; label: 2.11
title: Concepts
pagenum: 44; title: How to obtain the relevant problem information
pagenum: 44; title: How to write an effective problem report
pagenum: 44; title: How to organize the debugging process
pagenum: 44; title: How to track requirements
pagenum: 44; title: How to keep problem tracking simple
pagenum: 44; title: How to restore released versions
pagenum: 45; title: How to separate fixes and features
pagenum: 45; title: How to relate problems and fixes
pagenum: 45; title: How to relate problems and tests, make a problem report obsolete
pagenum: 45; label: 2.12
title: Tools
pagenum: 45; label: 2.13
title: Further Reading
pagenum: 46; title: Exercises
pagenum: 46; label: Chapter 3
title: Making Programs Fail
pagenum: 49; label: 3.1
title: Testing for Debugging
pagenum: 49; label: 3.2
title: Controlling the Program
pagenum: 50; label: 3.3
title: Testing at the Presentation Layer
pagenum: 53; label: 3.3.1
title: Low-Level Interaction
pagenum: 53; label: 3.3.2
title: System-Level Interaction
pagenum: 55; label: 3.3.3
title: Higher-Level Interaction
pagenum: 55; label: 3.3.4
title: Assessing Test Results
pagenum: 56; label: 3.4
title: Testing at the Functionality Layer
pagenum: 57; label: 3.5
title: Testing at the Unit Layer
pagenum: 59; label: 3.6
title: Isolating Units
pagenum: 63; label: 3.7
title: Designing for Debugging
pagenum: 66; label: 3.8
title: Preventing Unknown Problems
pagenum: 69; label: 3.9
title: Concepts
pagenum: 70; title: How to test for debugging
pagenum: 70; title: How to automate program execution
pagenum: 71; title: How to test at the presentation layer
pagenum: 71; title: How to test at the functionality layer
pagenum: 71; title: How to test at the unit layer
pagenum: 71; title: How to isolate a unit
pagenum: 71; title: How to design for debugging
pagenum: 71; title: How to prevent unknown problems
pagenum: 71; label: 3.10
title: Tools
pagenum: 72; label: 3.11
title: Further Reading
pagenum: 72; title: Exercises
pagenum: 73; label: Chapter 4
title: Reproducing Problems
pagenum: 75; label: 4.1
title: The First Task in Debugging
pagenum: 75; label: 4.2
title: Reproducing the Problem Environment
pagenum: 76; label: 4.3
title: Reproducing Program Execution
pagenum: 78; label: 4.3.1
title: Reproducing Data
pagenum: 80; label: 4.3.2
title: Reproducing User Interaction
pagenum: 80; label: 4.3.3
title: Reproducing Communications
pagenum: 82; label: 4.3.4
title: Reproducing Time
pagenum: 83; label: 4.3.5
title: Reproducing Randomness
pagenum: 83; label: 4.3.6
title: Reproducing Operating Environments
pagenum: 84; label: 4.3.7
title: Reproducing Schedules
pagenum: 86; label: 4.3.8
title: Physical Influences
pagenum: 88; label: 4.3.9
title: Effects of Debugging Tools
pagenum: 89; label: 4.4
title: Reproducing System Interaction
pagenum: 90; label: 4.5
title: Focusing on Units
pagenum: 91; label: 4.5.1
title: Setting Up a Control Layer
pagenum: 92; label: 4.5.2
title: A Control Example
pagenum: 92; label: 4.5.3
title: Mock Objects
pagenum: 95; label: 4.5.4
title: Controlling More Unit Interaction
pagenum: 97; label: 4.6
title: Reproducing Crashes
pagenum: 97; label: 4.7
title: Concepts
pagenum: 101; title: How to reproduce a problem
pagenum: 101; title: How to reproduce the problem environment
pagenum: 101; title: How to reproduce the problem execution
pagenum: 101; title: How to reproduce unit behavior
pagenum: 101; title: How to Mock objects
pagenum: 101; title: How to reproduce a crash
pagenum: 101; label: 4.8
title: Tools
pagenum: 101; label: 4.9
title: Further Reading
pagenum: 102; title: Exercises
pagenum: 102; label: Chapter 5
title: Simplifying Problems
pagenum: 105; label: 5.1
title: Simplifying the Problem
pagenum: 105; label: 5.2
title: The Gecko Bug-a-Thon
pagenum: 106; label: 5.3
title: Manual Simplification
pagenum: 109; label: 5.4
title: Automatic Simplification
pagenum: 110; label: 5.5
title: A Simplification Algorithm
pagenum: 112; label: 5.6
title: Simplifying User Interaction
pagenum: 117; label: 5.7
title: Random Input Simplified
pagenum: 118; label: 5.8
title: Simplifying Faster
pagenum: 119; label: 5.8.1
title: Caching
pagenum: 119; label: 5.8.2
title: Stop Early
pagenum: 120; label: 5.8.3
title: Syntactic Simplification
pagenum: 120; label: 5.8.4
title: Isolate Differences, Not Circumstances
pagenum: 121; label: 5.9
title: Concepts
pagenum: 123; title: How to simplify a test case
pagenum: 123; title: How to automate simplification
pagenum: 123; title: How to speed up automatic simplification
pagenum: 123; label: 5.10
title: Tools
pagenum: 123; label: 5.11
title: Further Reading
pagenum: 123; title: Exercises
pagenum: 124; label: Chapter 6
title: Scientific Debugging
pagenum: 129; label: 6.1
title: How to Become a Debugging Guru
pagenum: 129; label: 6.2
title: The Scientific Method
pagenum: 130; label: 6.3
title: Applying the Scientific Method
pagenum: 132; label: 6.3.1
title: Debugging `sample` — Preparation
pagenum: 132; label: 6.3.2
title: Debugging `sample` — Hypothesis 1
pagenum: 132; label: 6.3.3
title: Debugging `sample` — Hypothesis 2
pagenum: 133; label: 6.3.4
title: Debugging `sample` — Hypothesis 3
pagenum: 133; label: 6.3.5
title: Debugging `sample` — Hypothesis 4
pagenum: 133; label: 6.4
title: Explicit Debugging
pagenum: 134; label: 6.5
title: Keeping a Logbook
pagenum: 135; label: 6.6
title: Debugging Quick-and-Dirty
pagenum: 136; label: 6.7
title: Algorithmic Debugging
pagenum: 137; label: 6.8
title: Deriving a Hypothesis
pagenum: 140; label: 6.8.1
title: The Description of the Problem
pagenum: 140; label: 6.8.2
title: The Program Code
pagenum: 140; label: 6.8.3
title: The Failing Run
pagenum: 140; label: 6.8.4
title: Alternate Runs
pagenum: 141; label: 6.8.5
title: Earlier Hypotheses
pagenum: 141; label: 6.9
title: Reasoning about Programs
pagenum: 142; label: 6.10
title: Concepts
pagenum: 144; title: How to isolate a failure cause
pagenum: 144; title: How to understand the problem at hand
pagenum: 144; title: How to avoid endless debugging sessions
pagenum: 144; title: How to locate an error in a functional or logical program
pagenum: 144; title: How to debug quick-and-dirty
pagenum: 144; title: How to derive a hypothesis
pagenum: 144; title: How to reason about programs
pagenum: 144; label: 6.11
title: Further Reading
pagenum: 144; title: Exercises
pagenum: 145; label: Chapter 7
title: Deducing Errors
pagenum: 147; label: 7.1
title: Isolating Value Origins
pagenum: 147; label: 7.2
title: Understanding Control Flow
pagenum: 148; label: 7.3
title: Tracking Dependences
pagenum: 152; label: 7.3.1
title: Effects of Statements
pagenum: 152; label: 7.3.2
title: Affected Statements
pagenum: 153; label: 7.3.3
title: Statement Dependences
pagenum: 154; label: 7.3.4
title: Following Dependences
pagenum: 156; label: 7.3.5
title: Leveraging Dependences
pagenum: 156; label: 7.4
title: Slicing Programs
pagenum: 157; label: 7.4.1
title: Forward Slices
pagenum: 157; label: 7.4.2
title: Backward Slices
pagenum: 158; label: 7.4.3
title: Slice Operations
pagenum: 158; label: 7.4.4
title: Leveraging Slices
pagenum: 160; label: 7.4.5
title: Executable Slices
pagenum: 160; label: 7.5
title: Deducing Code Smells
pagenum: 161; label: 7.5.1
title: Reading Uninitialized Variables
pagenum: 161; label: 7.5.2
title: Unused Values
pagenum: 162; label: 7.5.3
title: Unreachable Code
pagenum: 162; label: 7.6
title: Limits of Static Analysis
pagenum: 166; label: 7.7
title: Concepts
pagenum: 170; title: How to isolate value origins
pagenum: 170; title: How to slice a program
pagenum: 170; label: 7.8
title: Tools
pagenum: 170; label: 7.9
title: Further Reading
pagenum: 171; title: Exercises
pagenum: 171; label: Chapter 8
title: Observing Facts
pagenum: 175; label: 8.1
title: Observing State
pagenum: 175; label: 8.2
title: Logging Execution
pagenum: 176; label: 8.2.1
title: Logging Functions
pagenum: 177; label: 8.2.2
title: Logging Frameworks
pagenum: 180; label: 8.2.3
title: Logging with Aspects
pagenum: 182; label: 8.2.4
title: Logging at the Binary Level
pagenum: 186; label: 8.3
title: Using Debuggers
pagenum: 188; label: 8.3.1
title: A Debugging Session
pagenum: 189; label: 8.3.2
title: Controlling Execution
pagenum: 192; label: 8.3.3
title: Postmortem Debugging
pagenum: 192; label: 8.3.4
title: Logging Data
pagenum: 193; label: 8.3.5
title: Invoking Functions
pagenum: 194; label: 8.3.6
title: Fix and Continue
pagenum: 194; label: 8.3.7
title: Embedded Debuggers
pagenum: 194; label: 8.3.8
title: Debugger Caveats
pagenum: 195; label: 8.4
title: Querying Events
pagenum: 196; label: 8.4.1
title: Watchpoints
pagenum: 196; label: 8.4.2
title: Uniform Event Queries
pagenum: 197; label: 8.5
title: Hooking into the Interpreter
pagenum: 199; label: 8.6
title: Visualizing State
pagenum: 200; label: 8.7
title: Concepts
pagenum: 202; title: How to observe state
pagenum: 203; title: How to encapsulate and reuse debugging code
pagenum: 203; title: How to observe the final state of a crashing program
pagenum: 203; title: How to automate observation
pagenum: 203; label: 8.8
title: Tools
pagenum: 203; label: 8.9
title: Further Reading
pagenum: 204; title: Exercises
pagenum: 204; label: Chapter 9
title: Tracking Origins
pagenum: 211; label: 9.1
title: Reasoning Backward
pagenum: 211; label: 9.2
title: Exploring Execution History
pagenum: 211; label: 9.3
title: Dynamic Slicing
pagenum: 213; label: 9.4
title: Leveraging Origins
pagenum: 216; label: 9.5
title: Tracking Down Infections
pagenum: 219; label: 9.6
title: Concepts
pagenum: 220; title: How to explore execution history
pagenum: 220; title: How to isolate value origins for a specific run
pagenum: 220; title: How to track down an infection
pagenum: 220; label: 9.7
title: Tools
pagenum: 221; label: 9.8
title: Further Reading
pagenum: 221; title: Exercises
pagenum: 221; label: Chapter 10
title: Asserting Expectations
pagenum: 223; label: 10.1
title: Automating Observation
pagenum: 223; label: 10.2
title: Basic Assertions
pagenum: 224; label: 10.3
title: Asserting Invariants
pagenum: 226; label: 10.4
title: Asserting Correctness
pagenum: 229; label: 10.5
title: Assertions as Specifications
pagenum: 232; label: 10.6
title: From Assertions to Verification
pagenum: 233; label: 10.7
title: Reference Runs
pagenum: 235; label: 10.8
title: System Assertions
pagenum: 238; label: 10.8.1
title: Validating the Heap with MALLOC_CHECK_
pagenum: 239; label: 10.8.2
title: Avoiding Buffer Overflows with ELECTRICFENCE
pagenum: 239; label: 10.8.3
title: Detecting Memory Errors with VALGRIND
pagenum: 240; label: 10.8.4
title: Language Extensions
pagenum: 241; label: 10.9
title: Checking Production Code
pagenum: 242; label: 10.10
title: Concepts
pagenum: 244; title: How to automate observation
pagenum: 244; title: How to use assertions
pagenum: 245; title: How to check a program against a reference program
pagenum: 245; title: How to check memory integrity
pagenum: 245; title: How to prevent memory errors in a low-level language
pagenum: 245; label: 10.11
title: Tools
pagenum: 245; label: 10.12
title: Further Reading
pagenum: 246; title: Exercises
pagenum: 247; label: Chapter 11
title: Detecting Anomalies
pagenum: 253; label: 11.1
title: Capturing Normal Behavior
pagenum: 253; label: 11.2
title: Comparing Coverage
pagenum: 254; label: 11.3
title: Statistical Debugging
pagenum: 259; label: 11.4
title: Collecting Data in the Field
pagenum: 260; label: 11.5
title: Dynamic Invariants
pagenum: 262; label: 11.6
title: Invariants On-the-Fly
pagenum: 265; label: 11.7
title: From Anomalies to Defects
pagenum: 266; label: 11.8
title: Concepts
pagenum: 267; title: How to determine abnormal behavior
pagenum: 267; title: How to summarize behavior
pagenum: 267; title: How to detect anomalies
pagenum: 267; title: How to compare coverage
pagenum: 267; title: How to sample return values
pagenum: 267; title: How to collect data from the field
pagenum: 267; title: How to determine invariants
pagenum: 267; label: 11.9
title: Tools
pagenum: 268; label: 11.10
title: Further Reading
pagenum: 268; title: Exercises
pagenum: 269; label: Chapter 12
title: Causes and Effects
pagenum: 271; label: 12.1
title: Causes and Alternate Worlds
pagenum: 271; label: 12.2
title: Verifying Causes
pagenum: 272; label: 12.3
title: Causality in Practice
pagenum: 273; label: 12.4
title: Finding Actual Causes
pagenum: 275; label: 12.5
title: Narrowing Down Causes
pagenum: 276; label: 12.6
title: A Narrowing Example
pagenum: 277; label: 12.7
title: The Common Context
pagenum: 277; label: 12.8
title: Causes in Debugging
pagenum: 278; label: 12.9
title: Concepts
pagenum: 279; title: How to show causality
pagenum: 279; title: How to find a cause
pagenum: 279; title: How to find an actual cause
pagenum: 279; label: 12.10
title: Further Reading
pagenum: 279; title: Exercises
pagenum: 280; label: Chapter 13
title: Isolating Failure Causes
pagenum: 283; label: 13.1
title: Isolating Causes Automatically
pagenum: 283; label: 13.2
title: Isolating versus Simplifying
pagenum: 284; label: 13.3
title: An Isolation Algorithm
pagenum: 286; label: 13.4
title: Implementing Isolation
pagenum: 288; label: 13.5
title: Isolating Failure-Inducing Input
pagenum: 290; label: 13.6
title: Isolating Failure-Inducing Schedules
pagenum: 291; label: 13.7
title: Isolating Failure-Inducing Changes
pagenum: 293; label: 13.8
title: Problems and Limitations
pagenum: 299; label: 13.9
title: Concepts
pagenum: 301; title: How to isolate a failure cause in the input
pagenum: 301; title: How to isolate a failure cause in the thread schedule
pagenum: 301; title: How to isolate a failure-inducing code change
pagenum: 301; label: 13.10
title: Tools
pagenum: 301; label: 13.11
title: Further Reading
pagenum: 301; title: Exercises
pagenum: 302; label: Chapter 14
title: Isolating Cause-Effect Chains
pagenum: 305; label: 14.1
title: Useless Causes
pagenum: 305; label: 14.2
title: Capturing Program States
pagenum: 307; label: 14.3
title: Comparing Program States
pagenum: 311; label: 14.4
title: Isolating Relevant Program States
pagenum: 312; label: 14.5
title: Isolating Cause-Effect Chains
pagenum: 316; label: 14.6
title: Isolating Failure-Inducing Code
pagenum: 320; label: 14.7
title: Issues and Risks
pagenum: 324; label: 14.8
title: Concepts
pagenum: 326; title: How to understand how a failure cause propagates through the program run
pagenum: 326; title: How to capture program states
pagenum: 326; title: How to compare program states
pagenum: 326; title: How to isolate failure-inducing program states
pagenum: 326; title: How to find the code that causes the failure
pagenum: 326; title: How to narrow down the defect along a cause-effect chain
pagenum: 326; label: 14.9
title: Tools
pagenum: 326; label: 14.10
title: Further Reading
pagenum: 327; title: Exercises
pagenum: 327; label: Chapter 15
title: Fixing the Defect
pagenum: 329; label: 15.1
title: Locating the Defect
pagenum: 329; label: 15.2
title: Focusing on the Most Likely Errors
pagenum: 330; label: 15.3
title: Validating the Defect
pagenum: 332; label: 15.3.1
title: Does the Error Cause the Failure?
pagenum: 333; label: 15.3.2
title: Is the Cause Really an Error?
pagenum: 333; label: 15.3.3
title: Think Before You Code; label: 15.4
title: Correcting the Defect
pagenum: 335; label: 15.4.1
title: Does the Failure No Longer Occur?
pagenum: 336; label: 15.4.2
title: Did the Correction Introduce New Problems?
pagenum: 336; label: 15.4.3
title: Was the Same Mistake Made Elsewhere?
pagenum: 337; label: 15.4.4
title: Did I Do My Homework?
pagenum: 338; label: 15.5
title: Workarounds
pagenum: 338; label: 15.6
title: Concepts
pagenum: 339; title: How to isolate the infection chain
pagenum: 339; title: How to find the most likely origins
pagenum: 339; title: How to correct the defect
pagenum: 339; title: How to ensure your correction is successful
pagenum: 339; title: How to avoid introducing new problems
pagenum: 339; label: 15.7
title: Further Reading
pagenum: 340; title: Exercises
pagenum: 340; label: Chapter 16
title: Learning from Mistakes
pagenum: 343; label: 16.1
title: Where the Defects Are
pagenum: 343; label: 16.2
title: Mining the Past
pagenum: 344; label: 16.3
title: Where Defects Come From
pagenum: 346; label: 16.4
title: Errors during Specification
pagenum: 347; label: 16.4.1
title: What You Can Do
pagenum: 347; label: 16.4.2
title: What You Should Focus On
pagenum: 348; label: 16.5
title: Errors during Programming
pagenum: 349; label: 16.5.1
title: What You Can Do
pagenum: 349; label: 16.5.2
title: What You Should Focus On
pagenum: 350; label: 16.6
title: Errors during Quality Assurance
pagenum: 351; label: 16.6.1
title: What You Can Do
pagenum: 352; label: 16.6.2
title: What You Should Focus On
pagenum: 353; label: 16.7
title: Predicting Problems
pagenum: 353; label: 16.7.1
title: Predicting Errors from Imports
pagenum: 354; label: 16.7.2
title: Predicting Errors from Change Frequency
pagenum: 355; label: 16.7.3
title: A Cache for Bugs
pagenum: 355; label: 16.7.4
title: Recommendation Systems
pagenum: 356; label: 16.7.5
title: A Word of Warning
pagenum: 356; label: 16.8
title: Fixing the Process
pagenum: 357; label: 16.9
title: Concepts
pagenum: 359; title: How to learn from mistakes
pagenum: 359; title: How to map defects to components
pagenum: 359; title: How to reduce the risk of errors in specification
pagenum: 359; title: How to reduce the risk of errors in the code
pagenum: 359; title: How to reduce the risk of errors in quality assurance
pagenum: 359; title: How to allocate quality-assurance resources wisely
pagenum: 359; label: 16.10
title: Further Reading
pagenum: 359; title: Exercises
pagenum: 360; title: Appendix: Formal Definitions
pagenum: 363; label: A.1
title: Delta Debugging
pagenum: 363; label: A.1.1
title: Configurations
pagenum: 363; label: A.1.2
title: Passing and Failing Run
pagenum: 363; label: A.1.3
title: Tests
pagenum: 363; label: A.1.4
title: Minimality
pagenum: 364; label: A.1.5
title: Simplifying
pagenum: 364; label: A.1.6
title: Differences
pagenum: 364; label: A.1.7
title: Isolating
pagenum: 365; label: A.2
title: Memory Graphs
pagenum: 365; label: A.2.1
title: Formal Structure
pagenum: 365; label: A.2.2
title: Unfolding Data Structures
pagenum: 367; label: A.2.3
title: Matching Vertices and Edges
pagenum: 368; label: A.2.4
title: Computing the Common Subgraph
pagenum: 368; label: A.2.5
title: Computing Graph Differences
pagenum: 369; label: A.2.6
title: Applying Partial State Changes
pagenum: 371; label: A.2.7
title: Capturing C State
pagenum: 372; label: A.3
title: Cause-Effect Chains
pagenum: 374; title: Glossary
pagenum: 377; title: Bibliography
pagenum: 381; title: Index
pagenum: 391