A program fails. How can we locate the cause? A new generation of program analysis techniques automatically determines failure causes - in the input, in the set of code changes, or in the program state - and extracts precise descriptions of program behavior through systematic experimentation.
In contrast to "classical" static analysis, these new techniques exploit the data from multiple concrete runs - and may even generate further runs as needed. In this lecture, we explore the state of the art in automated debugging and automated specification mining, using real-life case studies such as Firefox, GCC, or AspectJ.