Deterministic replay is a powerful approach for debugging multithreaded and distributed applications that involve complex non-determinism. Recently, several replay tools based on user-space libraries were proposed. Such library-based tools are lightweight and efficient, and focus on the application being debugged. However, several significant problems remain, such as in-address-space tool interference, absence of support for advanced features in modern operating systems (e.g. asynchronous I/O), and error-prone engineering efforts for wrapping a large set of API (Application Programming Interface) functions to enable logging and replaying.