1. A method for analyzing a computer program, the method comprising: executing a computer program in a virtual machine on a first system; recording a log comprising non-deterministic events in the virtual machine's instruction stream; replaying the virtual machine's instruction stream at a separate, decoupled analysis system in synchronization and in parallel with the execution of the computer program using the log; and executing program analysis code at the analysis system during the replay, wherein data outputs from the computer program are held until a corresponding confirmation is received from the analysis system so that the computer program is synchronized with the analysis system, the confirmation indicating that the analysis system has reached a particular point in the execution of the instruction stream of the virtual machine.