  Debugging is difficult. Recent studies show that automatic bug localization
techniques have limited usefulness. One of the reasons is that programmers
typically have to understand why the program fails before fixing it. In this
work, we aim to help programmers understand a bug by automatically generating
likely invariants which are violated in the failed tests. Given a program with
an initial assertion and at least one test case failing the assertion, we first
generate random test cases, identify potential bug locations through bug
localization, and then generate program state mutation based on active learning
techniques to identify a predicate "explaining" the cause of the bug. The
predicate is a classifier for the passed test cases and failed test cases. Our
main contribution is the application of invariant learning for bug explanation,
as well as a novel approach to overcome the problem of lack of test cases in
practice. We apply our method to real-world bugs and show the generated
invariants are often correlated to the actual bug fixes.
