1. A method to identify threads responsible for causing a concurrency violation in a multi-threaded program comprising: executing, with a processor, a first thread controller inserted into a first thread of the multi-threaded program, the first thread controller defining a first condition; executing, with the processor, a second thread controller inserted into a second thread of the multi-threaded program, the second thread controller defining a second condition; determining whether at least one of the first condition or the second condition is met; based on whether the at least one of the first condition or the second condition is met, serializing an operation of the first thread of the multi-threaded program relative to an operation of the second thread of the multi-threaded program, the serializing to force the concurrency violation to occur, wherein the serializing occurs when the first and second conditions are concurrently met; and based on the occurrence of the concurrency violation, identifying the first and second threads as being responsible for causing the concurrency violation.