最近的 Intel 处理器提供了一个硬件功能(又名Precise Event-Based Sampling (PEBS)
)来访问有关某些 CPU 采样事件(例如 )的 CPU 状态的精确信息e
。这是英特尔 64 和 IA-32 架构的软件开发人员手册:第 3 卷的摘录:
18.15.7 处理器基于事件的采样(PEBS)
基于英特尔 NetBurst 微架构的处理器中的调试存储 (DS) 机制允许收集两种类型的信息以用于调试和调整程序:PEBS 记录和 BTS 记录。
基于Chapter 17
相同的参考,x86-64
架构的DS格式如下:
记录
BTS Buffer
最后N
执行的分支(N
取决于微架构),同时PEBS Buffer
记录以下寄存器:
IIUC,设置一个计数器,每个事件(
e
)发生递增它的价值。当计数器溢出时,将向这两个缓冲区添加一个条目。最后,当这些缓冲区达到一定大小(BTS Absolute Maximum
和PEBS Absolute Maximum
)时,会产生中断,并将两个缓冲区的内容转储到磁盘。这会定期发生。似乎--call-graph dwarf
回溯数据也是在同一个处理程序中提取的,对吧?
1) 这是否意味着LBR
和PEBS
( --call-graph --lbr
) 状态完美匹配?
--call-graph dwarf
2)不属于的输出怎么样PEBS
(在上面的参考中似乎很明显)?(有些RIP/RSP
不匹配回溯)
准确地说,这是一个LKML Thread,其中Milian Wolff
显示第二个问题是NO。但我不完全明白原因?
第一个问题的答案也是,NO(Andi Kleen
在线程的后面消息中表示),我完全不明白。
3)这是否意味着整个DWARF
调用图信息已完全损坏?
上面的线程没有显示这一点,在我的实验中我没有看到任何RIP
不匹配的回溯。换句话说,我可以相信大多数回溯吗?
我不喜欢这种LBR
方法本身可能不精确。它还受限于回溯的大小。虽然,这是一个克服尺寸问题的补丁。但这是最近的,可能是假的。
更新:
- 怎么可能强制
Perf
只存储一条记录PEBS Buffer
?是否只能间接强制此配置,例如,当PEBS
事件需要调用图信息时?