A program fails. Under which circumstances does the failure occur? Starting with a single failure-inducing input (łThe input ((4)) failsž) and an input grammar, the ddset algorithm uses systematic tests to automatically generalize the input to an abstract failureinducing input that contains both (concrete) terminal symbols and (abstract) nonterminal symbols from the grammarÐfor instance, ł((⟨expr⟩))ž, which represents any expression ⟨expr⟩ in double parentheses. Such an abstract failure-inducing input can be used (1) as a debugging diagnostic, characterizing the circumstances under which a failure occurs (łThe error occurs whenever an expression is enclosed in double parenthesesž); (2) as a producer of additional failure-inducing tests to help design and validate fixes and repair candidates (łThe inputs ((1)), ((3 * 4)), and many more also failž). In its evaluation on real-world bugs in JavaScript, Clojure, Lua, and UNIX command line utilities, ddset's abstract failure-inducing inputs provided to-the-point diagnostics, and precise producers for further failure inducing inputs. CCS CONCEPTS • Software and its engineering → Software testing and debugging; • Theory of computation → Grammars and context-free languages; Active learning.