Processor Tracing | 处理器追踪
Posted rtoax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Processor Tracing | 处理器追踪相关的知识,希望对你有一定的参考价值。
目录
https://software.intel.com/content/www/us/en/develop/blogs/processor-tracing.html
英特尔®处理器跟踪(英特尔®PT)是未来处理器中即将推出的一项令人兴奋的新功能,它对调试非常有帮助,因为它将通过触发和过滤功能公开准确而详细的活动跟踪,以帮助隔离重要的跟踪。我们最近发布了规范,现在提供了一个库来支持工具开发,并在本周就使这些功能在Linux中可用的工作进行了演讲。工具和操作系统开发人员具有规范和支持开发的库。
英特尔随所有示例工具一起发布了一个库,以支持使用作为免费下载的“处理器跟踪解码器库”提供的英特尔®处理器跟踪(Intel®PT)。我可以向您介绍有关该项目的一些信息,我还将解释英特尔PT来激发处理器跟踪解码器库的解码功能。
该项目本身将能够支持任何已启用使用英特尔PT的操作系统。英特尔PT是作为表演事件呈现的,因此,通过查看该事件是否可用于配置/使用,很容易检测到对操作系统的支持。Linux的更改已在研究中;本周介绍了一些Linux工作的状态。随着时间的流逝,我希望包括Windows和OS X在内的其他操作系统也将支持Intel PT,并且处理器跟踪解码器库也已准备就绪。目前已验证解码器库可在Linux,Windows和OS X上构建,因此可以使用了!
Processor Trace Decoder Library的项目包含一个用于解码Intel PT的库,以及在该库之上构建的简单工具的示例实现,这些示例工具展示了如何在自己的工具中使用该库。下载中包括以下内容:
- libipt:数据包编码器/解码器库以及描述解码器库用法的文档。
- 可选内容和样本:
- ptdump:数据包转储器的示例实现。
- ptxed:跟踪反汇编程序的示例实现。
- pttc:跟踪测试生成器。
- 脚本:脚本的集合。
处理器跟踪
英特尔最近在最新的《英特尔®体系结构指令集扩展编程参考》第11章中发布了有关英特尔处理器跟踪的详细信息。英特尔处理器跟踪是一种低开销的执行跟踪功能,将来会被某些处理器支持。它通过使用专用硬件设施捕获有关每个硬件线程上的软件执行信息的方式工作,以便在执行完成后,软件可以对捕获的跟踪数据进行处理并重建确切的程序流。英特尔PT在执行开销方面不是免费的,但是开销很低,足以在大多数应用程序的生产版本中正常运行。
捕获的信息收集在数据包中。Intel PT的第一个实现提供了控制流跟踪,该控制流跟踪在这些数据包中包括时序和程序流信息(例如,分支目标,分支采用/未采用的指示)以及程序引发的模式相关信息(例如,英特尔®TSX状态转换,CR3变化)。这些数据包可以在发送到内存子系统之前在内部进行缓冲。
为什么这有用?
英特尔PT提供有关各种事件的上下文。性能分析器可以使用PT发现“响应时间”问题的根本原因-那些影响执行质量(如果不是整个运行时)的性能问题。例如,使用PT,视频应用程序开发人员可以非常详细地探索有问题的单个帧的执行,而这对于采用传统的基于采样的采集通常是不可能的。
此外,英特尔PT提供的完整跟踪功能可以比以前更深入地了解执行情况。例如,从进入和退出到特定的后沿和循环跳闸次数的循环行为很容易提取和报告。
重构代码流
调试器可以使用它来重构导致当前位置的代码流。无论是崩溃站点,断点,观察点,还是仅仅是我们刚刚跳过的函数调用之后的指令。它们甚至可以允许通过反向步进命令在记录的执行历史中导航。
调试堆栈损坏
另一个重要的用例是调试堆栈损坏。调用堆栈损坏后,正常的帧展开通常会失败或可能无法产生可靠的结果。英特尔PT可用于根据实际的CALL和RET指令重建堆栈回溯跟踪。
操作系统可以将Intel PT包含到核心文件中。这将使调试器不仅可以在崩溃时检查程序状态,还可以重建导致崩溃的控制流。也可以将其扩展到整个系统,以调试内核崩溃和其他系统挂起。Intel PT可以进行全局跟踪,以便在发生操作系统崩溃时可以将跟踪保存为操作系统崩溃转储机制的一部分,然后在以后用于重建故障。
英特尔PT还可以帮助缩小多线程操作系统和用户程序代码中的数据争用。它可以用粗略的时间指示记录所有线程的执行情况。尽管它不够精确,无法自动检测数据竞争,但它可以提供足够的信息来帮助进行分析。
跟踪缓冲区管理
跟踪数据可以收集到操作系统提供的循环缓冲区中。为了简化内存管理并使操作系统更容易找到合适的大容量内存,缓冲区不必是连续的。
逻辑缓冲区由存储页面的集合和描述页面布局的控制结构组成。操作系统可能会将Intel PT配置为在任何部分接近已满时生成中断。
这启用了各种不同的用例:
- 单个循环缓冲区
- 带复制的单个缓冲区
- 单个缓冲区,逐节复制
尽管Intel PT生成的数据太多,无法长时间将执行跟踪信息存储到磁盘上,但可以保存较短的代码段。
英特尔使Linux能够通过perf_event接口为Intel PT提供支持。
执行流重构
Intel PT使用一种紧凑格式来存储执行跟踪。它忽略了可以直接从代码或以前的跟踪中推断出的所有内容。
您可以将其与导航迷宫的简要说明列表进行比较。只要方法很明显,您就可以简单地跟随迷宫的曲折。来到路口时,您需要知道是向左转还是向右转。为了导航迷宫,您真正需要的只是左右方向的简短列表。与此类似,Intel PT使用单个位来指示是否已采用条件分支。跟踪中根本没有表示无条件跳转和线性代码。
PT跟踪由一系列数据包(具有不同的类型)组成。例如,为了表示条件分支的选择,Intel PT使用的TNT数据包有两种不同的大小:8位和64位。为了重构执行流程,还需要考虑其他一些事情,例如间接分支,函数返回或中断。为了对此建模,英特尔PT添加了更多数据包,例如TIP用于间接分支和函数返回,以及FUP用于异步事件位置。然后,中断将被表示为FUP,后跟一个TIP,分别给出异步分支的源和目的地。英特尔PT还提供有关事务同步的信息。每当事务开始,落实或中止时,Intel PT都会生成两个数据包:MODE.TSX数据包提供新的事务状态,FUP数据包给出了新状态生效的代码位置。对于事务中止,将生成一个附加的TIP数据包,以提供相应中止处理程序的位置。
请参阅规范(《英特尔®体系结构指令集扩展程序设计参考》的第11章)以获取受支持数据包的完整列表。
为了重构执行流程,解码器因此需要对所跟踪的可执行文件或库以及PT跟踪数据包中的指令进行解码。为了处理动态库,解码器还需要考虑操作系统提供的边带信息。
英特尔提供了一个开源参考实现,用于解码PT数据包并重构执行流程。该处理器跟踪解码库(工具和库以能够使用英特尔处理器跟踪的集合)可作为免费下载。英特尔目前正在努力帮助启用GNU *调试器GDB。也正在考虑与其他工具的其他集成。
总结
英特尔提供了一种低开销的跟踪功能,该功能允许记录执行流并在以后重新构造它。此功能具有用于功能以及性能调试的应用程序。
以上是关于Processor Tracing | 处理器追踪的主要内容,如果未能解决你的问题,请参考以下文章
Ray Tracing in One Weekend 超详解 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧