Programs often fail when they undergo change and evolve. In this paper, we take a fresh look at the problem of debugging evolving programs. Given two versions of a program (a stable and a modified version) and failing input, our approach uses concolic execution to synthesize one or more new inputs whose behavior differs from the failing input in the modified version of the program but matches the behavior in the stable version. This difference in behavior provides critical clues to the root cause of the failure. A notable feature of our approach is that it can often point to the cause of the bug in stable version of the program.

We have performed experiments on programs from a well-known benchmark suite (SIR benchmarks) to evaluate the size and quality of our bug reports. Our experience with a large image processing application points to the efficacy of our method in detecting and comprehending real-life bugs.