Combining Static And Dynamic Analysis To Find Multi-Threading Faults Beyond Data Races