A case study for reversible computing: Reversible debugging of concurrent programs