Multithreaded programs are difficult to write, analyze, test, and debug; a key reason is that different runs of a multithreaded program may show different behaviors, depending on how the threads interleave.
For instance, testing becomes less assuring because the thread schedules tested may not be the ones run in the field. Similarly, debugging becomes quite challenging because developers often have to reproduce the buggy thread schedules for diagnosis. In this talk, I’ll present Peregrine, a compiler and runtime system we have built to simultaneously address these problems by memoizing schedules and reusing them on future inputs if possible. Toward the end of my talk, I’ll briefly talk about how we are leveraging Peregrine to create a precise static analysis framework for multithreaded programs.