I. Introduction
Testing and debugging multithreaded programs is particularly difficult [1]. Some executions may be rarely exposed during the development of an application (e.g. because they rely on a particular interleaving of threads), and, even if they are discovered, it would be difficult to reproduce them. In addition, some executions may be exposed only by specific compilers, virtual machines or hardware architectures.