Applying Model-Based Diagnosis to Software Debugging of Concurrent and Sequential Imperative Programming Languages