Abstract :
The ultimate source of truth regarding a program is its execution. When a program runs, everything comes to light: correctness, CPU and memory use, and even interactions with (potentially buggy) libraries, operating systems, and hardware. Yet, this source of truth is also fleeting, rushing into oblivion at the tune of billions of instructions per second. Worse, capturing that truth can be a tricky, tortuous, or downright treacherous affair. Peeking into a program´s operation typically involves preparing a special version of it: we might compile it with specific flags or options, link it with appropriate libraries, or run it with suitable arguments. Often, we can´t easily reproduce a problem, so we need to ship our carefully crafted program version to a customer, who then will have to wait for the problem to appear again. Irritatingly, some of the ways we instrument programs make the program too slow for production use or obfuscate the original problem