Living on the edge: Rapid-toggling probes with cross modification on x86
Dynamic probe injection is now a widely used method to debug performance in production. Current techniques for dynamic probing of native code, however, rely on an expensive stop-the-world approach: binary changes are made within a safe state of the program—typically in which all the program threads are halted—to ensure that another thread executing the modified code region doesn’t step into a partially-modified code.
Stop-the-world patching is not scalable. In contrast, low overhead, scalable probes that can be rapidly toggled on and off in-place would open up new use cases for statistical profilers and language implementations, even traditional ahead-of-time, native-code compilers. In this paper we introduce safe cross-modification protocols that mutate x86 code between threads but do not require quiescing threads, resulting in radically lower overheads than existing solutions. A key problem is handling instructions that straddle cache lines. We empirically evaluate existing x86 architectures to derive a safe policy given current processor behavior, and we argue that future architectures should clarify the semantics of instruction fetching to make cheap cross-modification easier and future proof.
Wed 15 Jun
|10:30 - 11:00|
Kayvan MemarianUniversity of Cambridge, Justus MatthiesenUniversity of Cambridge, James LingardUniversity of Cambridge (when this work was done), Kyndylan NienhuisUniversity of Cambridge, David ChisnallUniversity of Cambridge, Robert N.M. WatsonUniversity of Cambridge, Peter SewellUniversity of CambridgeLink to publication Media Attached
|11:00 - 11:30|
Buddhika Chamith, Bo Joel SvenssonIndiana University, Luke DalessandroIndiana University, Ryan R. NewtonIndiana UniversityPre-print Media Attached
|11:30 - 12:00|
|Pre-print Media Attached|