Pure speculation: You don't need to record everything, only enough information to reconstruct what happened later (e.g. outcomes of branches, results of system calls, etc). You can then run a post-processing phase after execution (or in parallel on another thread) to fill in the extra detail that is needed for efficiently presenting what happened.