【发布时间】:2021-04-11 01:20:07
【问题描述】:
perf 能够记录多个字段,例如 addr、ip、timestamp。它还可以记录通用寄存器,如https://github.com/torvalds/linux/blob/master/tools/perf/arch/x86/util/perf_regs.c 所示。但是我找不到任何有关使用 perf 记录控制寄存器的相关文档。那么如何使用 perf 来实现呢?还有其他可用的工具吗?
【问题讨论】:
perf 能够记录多个字段,例如 addr、ip、timestamp。它还可以记录通用寄存器,如https://github.com/torvalds/linux/blob/master/tools/perf/arch/x86/util/perf_regs.c 所示。但是我找不到任何有关使用 perf 记录控制寄存器的相关文档。那么如何使用 perf 来实现呢?还有其他可用的工具吗?
【问题讨论】:
您无法使用perf 工具记录控制寄存器值。您可以使用--intr-regs 选项采样的寄存器列表仅限于here 列出的寄存器。您可以通过查看here 来确认这一点。
perf events 模块可以访问的寄存器取决于架构,如here 和here 所示。此commit 已将选择性寄存器状态包括到perf record/script 输出中。这意味着,所有perf 将仅限于使用已指定的寄存器,仅此而已。
还有其他问题/答案here,告诉您编写程序/内核模块以访问控制寄存器的一些方法。最重要的是,您可以使用 QEMU(在 TCG 模式下)并在 VM 中运行您的程序。然后,您可以定期打印寄存器状态(在每个 TB 结束时 - 您将看到所有寄存器值)。也有像 GDB 这样的指定仿真器,可能会对您有所帮助。
编辑 -
有一种方法可以记录cr3 寄存器值。您可以使用IntelPT 在程序执行期间记录程序的控制流信息。 IntelPT 在 PIP 数据包的帮助下跟踪对 CR3 寄存器的更改。您可以使用 IntelPT 生成的轨迹来跟踪和确定 CR3 值。
【讨论】: