Program debugging is a process of identifying and
fixing bugs. Identifying root causes is the hardest,
thus the most expensive, component of debugging.
Developers often take a slice of the statements
involved in a failure, hypothesize a set of potential
causes in an ad hoc manner, and iteratively verify
and refine their hypotheses until root causes are
located. Obviously, this process can be quite tedious
and time-consuming. Furthermore, as software
systems are getting increasingly complex, the
inefficiencies of the manual debugging process are
getting magnified.
Many automated approaches have been proposed
to facilitate program debugging. All these
approaches share the same ultimate goal, which
is to help developers quickly and accurately pinpoint
the root causes of failures.
This course will cover state-of-the-art automated
debugging approaches from both practical and
research perspectives and will consist of two main
parts. The goal of the first part is two folds: 1) To
turn program debugging from a black art (as
many believe) into a systematic and well-organized
discipline; and 2) To provide students with enough
background information to read and understand
the scientific literature. The topics which will be
covered in the first part are: How Failures Come To
Be, Tracking Problems, Making Programs Fail,
Reproducing Problems, Simplifying Problems,
Scientific Debugging, Deducing Errors, and Mining
and Detecting Anomalies. The second part of the
course will survey the related literature by dividing
it into four broad categories, namely static-
analysis-based, dynamic-analysis-based,
model-based, and empirical approaches.
|