Table of Contents
-
Preface
-
Introduction
-
The nature of the problem
-
The six ways of thinking
-
The two eras of software engineering
-
Structured development history
-
Object-oriented development history
-
Debugging and development methodologies
-
Constructive versus cognitive activities
-
Confusing testing and debugging
-
Supporting disciplines developed later
-
Uncommonly common sense
-
Debugging by thinking
-
Review
-
Sherlock Holmes
-
Preview
-
Worldview of the detective
-
Detective fiction
-
The character of Sherlock Holmes
-
The life of Sherlock Holmes
-
The literature about Sherlock Holmes
-
The author behind Sherlock Holmes
-
The methods of Sherlock Holmes
-
Applying Holmes to debugging
-
Use cross-disciplinary knowledge
-
Focus on facts
-
Pay attention to unusual details
-
Gather facts before hypothesizing
-
State the facts to someone else
-
Start by observing
-
Don't guess
-
Eliminate impossible causes
-
Exclude alternative explanations
-
Reason in both directions
-
Watch for red herrings
-
Review
-
Lord Peter Wimsey
-
Preview
-
The character of Lord Peter Wimsey
-
The life of Lord Peter Wimsey
-
The literature about Lord Peter Wimsey
-
The author behind Lord Peter Wimsey
-
The methods of Lord Peter Wimsey
-
Applying Wimsey to debugging
-
Use alibis as clues
-
Eliminate impossible causes
-
Exercise curiosity
-
Reason based on facts
-
Use the power of logic
-
Enumerate possibilities
-
Use a system for organizing facts
-
Exercise caution when searching
-
Use gestalt understanding
-
Show how something could be done
-
Review
-
Professor Solomon
-
Preview
-
The methods of Professor Solomon
-
How to find lost objects
-
Applying Professor Solomon's method to debugging
-
Don't look for it
-
It's not lost, you are
-
Remember the three c's
-
It's where it's supposed to be
-
Look for domestic drift
-
You're looking right at it
-
The camouflage effect
-
Think back
-
Look once, look well
-
The eureka zone
-
Tail thyself
-
It wasn't you
-
Review
-
Case Studies I
-
Case Study 1
-
The program
-
Bug 1
-
Bug 2
-
Bug 3
-
Bug 4
-
Bug 5
-
Bug 6
-
Bug 7
-
Bug 8
-
Bug 9
-
Bug 10
-
Bug 11
-
Bug 12
-
Bug 13
-
Bug 14
-
Bug 15
-
Mathematical Problem Solving
-
Preview
-
Worldview of the mathematician
-
Polya and mathematical heuristics
-
How to Solve It -- G. Polya
-
Evaluation
-
Mathematical proof texts
-
The Nuts and Bolts of Proofs -- A. Cupillari
-
Thinking Mathematically -- Mason, Burton, and Stacy
-
How to Read and Do Proofs -- Daniel Solow
-
Schoenfeld and mathematical problem solving
-
Resources per Schoenfeld
-
Heuristics per Schoenfeld
-
Control per Schoenfeld
-
Belief systems per Schoenfeld
-
Applying Schoenfeld to debugging
-
Transferring the hierarchy
-
The military analogy
-
Hypothesis generation and evaluation
-
Review
-
Debugging Strategies
-
Preview
-
Evaluation mechanisms
-
Binary search strategy
-
Binary search assumptions
-
Binary search control structure
-
Greedy search strategy
-
Greedy search assumptions
-
Greedy search control structure
-
Breadth-first search strategy
-
Breadth-first search assumptions
-
Breadth-first control structure
-
Depth-first search strategy
-
Depth-first search assumptions
-
Depth-first control structure
-
Program slice strategy
-
Program slice assumptions
-
Program slice control structure
-
Deductive-analysis strategy
-
Deductive-analysis assumptions
-
Deductive-analysis control structure
-
Inductive-analysis strategy
-
Inductive-analysis assumptions
-
Inductive-analysis control structure
-
Choosing a strategy
-
Review
-
Debugging Heuristics
-
Preview
-
Stabilize the program
-
Create a test case
-
Cutting down a simple application problem
-
Cutting down a GUI application problem
-
Cutting down a compiler problem
-
Reduce the required input
-
Categorize the problem
-
Correctness
-
Completion
-
Robustness
-
Efficiency
-
Describe the problem
-
Explain the problem to someone else
-
Recall a similar problem
-
Draw a diagram
-
Choose a hypothesis from historical data
-
Review
-
Debugging Tactics
-
Preview
-
Read the source code
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Write a unit test
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Display variable values
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Display execution messages
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Display procedure arguments
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Generate a flow trace
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Generate a variable snapshot
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Generate memory dump
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Force variable value
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Assert assumptions
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Check data structures
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Display data structures
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Use runtime subscript checking
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Related tactics
-
Choosing tactics
-
Use runtime stack checking
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Use runtime heap checking
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Initialize global variables
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Initialize local variables
-
Basic tactic
-
Purpose
-
Questions answered
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Change storage class
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Use a different compiler
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
-
Compile to assembly code
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Execute on a different platform
-
Basic tactic
-
Purpose
-
Questions answered
-
Potential problems
-
Refined tactics
-
Related tactics
-
Choosing tactics
-
Review
-
Case Studies II
-
Case Study 2
-
The Program
-
Bug 1
-
Bug 2
-
Bug 3
-
Bug 4
-
Case Sudy 3
-
The Program
-
Bug 1
-
Bug 2
-
Bug 3
-
Bug 4
-
Bug 5
-
Bug 6
-
Bug 7
-
Bug 8
-
Bug 9
-
Bug 10
-
The Way of the Safety Expert
-
Preview
-
Worldview of the safety expert
-
Root-cause analysis
-
Software-defect root causes
-
General information
-
Symptom description
-
Design errors
-
Coding errors
-
Cause-and-event charting
-
Fault-tree analysis
-
Review
-
The Way of the Psychologist
-
Preview
-
Worldview of the psychologist
-
Models of human cognition
-
Defining and classifying human error
-
Defining human error
-
Classifying different errors
-
Explaining error causes
-
Skill-based errors
-
Inattention failures
-
Overattention failures
-
Memory failures
-
Rule-based errors
-
Misapplication of good rules
-
Application of bad rules
-
Knowledge-based errors
-
Research review
-
Youngs, 1974
-
Gould, 1975
-
Brooke and Duncan, 1980
-
Gilmore and Smith, 1984
-
Anderson and Jeffries, 1985
-
Spohrer, Soloway, and Pope, 1985
-
Vessey, 1985, 1986
-
Gugerty and Olson, 1987
-
Kessler and Anderson, 1987
-
Spohrer and Soloway, 1987
-
Katz and Anderson, 1988
-
Vessey, 1989
-
Carver, 1989
-
Stone, Jordan, and Wright, 1990
-
Allwood and Bjhorhag, 1991
-
Ebrahami, 1994
-
Summary
-
Review
-
The Way of the Engineer
-
Preview
-
Worldview of the engineer
-
Classifying errors by development stage
-
Conception stage
-
Expression stage
-
Transcription stage
-
Avoiding errors by development stage
-
Avoiding conception-stage errors
-
Avoiding expression-stage errors
-
Avoiding transcription-stage errors
-
Avoiding errors by coding conventions
-
Object-oriented programming
-
Programming convention
-
Building debugging infrastructure
-
Augmented data structures
-
Augmented procedures
-
Specialized interactive debuggers
-
Assertions
-
Review
-
The Way of The Computer Scientist
-
Preview
-
The worldview of the computer scientists
-
Classifying errors by linguistic formalism
-
Detecting errors by linguistic formalism
-
Regular grammars
-
Context-free grammars
-
Semantic analysis
-
Static-analysis tools
-
Static analysis
-
Splint
-
CodeSurfer
-
PC-lint/FlexeLint
-
Dynamic-analysis tools
-
Dynamic analysis
-
Insure++
-
BoundsChecker
-
Purify
-
mpatrol
-
Examples
-
Analysis comparison
-
Static-analysis tools
-
Dynamic-analysis tools
-
Review
-
Get Back to Work
-
Review the methods
-
Measure your work
-
Visit our Web site
-
Download new debugging tools
-
Springboard to other sites
-
Read reviews of other publications
-
Contact the author
-
Glossary
-
Root-cause Checklist
-
Books about Debugging
-
Software Recommendations
-
References
-
Index