您可以使用 Intel CPU 的基于事件的精确采样 (PEBS) 功能。
PEBS 可以在每次性能监视器计数器 (PMC) 触发性能监视器中断 (PMI) 时将架构信息(例如 GP 寄存器内容)存储在设计的缓冲区中。
可以设置 PMC 以根据阈值触发 PMI。
PEBS 只能在 IA32_PMC0 上启用,但这不是限制。
它是在 Intel Netburst 架构 (Pentium 4) 中引入的,因此可以在每个现代 Intel 的 CPU 上使用。
在启用 PEBS 的事件中,INSTR_RETIRED.ANY_P 可能是您要查找的事件(注意:我不认为这个计数器每次都会逐步递增,但这应该是轻微的噪音/与您的分析无关)。
PMI 是通过本地 APIC 调度的,因此您必须查看它以将其转换为中断向量,以便将 ISR 附加到它。
PEBS 需要一些设置,尤其是调试存储 (DS) 区域和一些用于存储记录的元结构。
通过对 PMC0 进行编程以计算退出的指令(奖励,您可以使用不同的阈值来调整记录的粒度),通过安装读取 PEBS 记录并将其保存到某个位置的 PMI ISR,最后通过启用 PEBS,您将能够记录寄存器的内容。
请注意,这必须在操作系统内部完成,因此您必须精通 Windows 内部,尤其是调度程序。
加上收集的信息量很大,因此系统仍然会出现相当大的减速。
使用 PMC 的一个很好的副作用是您可以只为用户代码、内核代码或两者都启用它们(如果需要)。
PEBS 功能的完整参考可以在Intel's Manual Volume 3 的第 18 章中找到。
第 17 章是预防性的。
如果 PEBS 过于繁琐,您可以尝试使用 TF 来强制执行每条指令上的 CPU 陷阱。
结合最后分支记录 (LBR) 功能,您可以逐个跳转而不是逐个指令。
它还可以与任务状态段 (TSS) 和 C. 结合使用,以在 Trap 中断时自动执行一些记录(如将上下文溢出到内存中)。
我不知道有任何其他方法可以跟踪寄存器。
虚拟机扩展 (VMX) 没有用,因为更改 GP 寄存器不使用关键指令。
在 Linux 下,可以查看rr,但这不是你的情况。
如果可以的话,也许在系统调用边界跟踪寄存器内容(例如,通过重定向syscall,这对驱动程序来说很容易)是一个更好的主意。
进程不断更改它们的寄存器,但最终只有它们传递给系统调用的内容才会影响系统(这忽略了 0 天和共享内存)。