处理器跟踪
为什么这样有用?
重构代码流
调试堆栈损坏
跟踪缓冲区管理
执行流重构
总结
https://software.intel.com/content/www/us/en/develop/blogs/processor-tracing.html
英特尔处理器跟踪(英特尔)PT)这是一个令人兴奋的新功能,将在未来的处理器中推出,因为它将通过触发和过滤功能公开、准确和详细地进行调试,帮助隔离重要跟踪。我们最近发布了一个标准,现在提供了一个支持工具开发的图书馆,并使这些功能在本周Linux演讲中可用的工作。工具和操作系统开发人员有标准化和支持开发的库。
以支持使用为免费下载的所有示例工具,英特尔发布了一个库”提供的。我可以向你介绍一些关于这个项目的信息,我将解释英特尔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提供的完整跟踪功能可以比以前更深入地了解执行情况。例如,从进出到特定后沿和循环跳闸次数的循环行为很容易提取和报告。
。无论是,或者只是我们刚跳过的函数调用后的指令。它们甚至可以通过反向步进命令导航记录的执行历史。
另一个重要的用例是。调用堆栈损坏后,正常帧扩展通常会失败或可能无法产生可靠的结果。。
可以操作系统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。也正在考虑与其他工具的其他集成。
英特尔提供了一种低开销的跟踪功能,该功能允许记录执行流并在以后重新构造它。此功能具有用于功能以及性能调试的应用程序。