使用Perf生成原始Intel处理器跟踪

时间:2017-03-12 19:27:19

标签: debugging intel trace processor perf

我的任务是生成原始英特尔处理器跟踪。通过raw,我的意思是跟踪符合文件头:

struct pt_logfile_header {
    unsigned int magic;
    unsigned int version;
};

然后是各种进程,线程,xpage和缓冲区结构:

/* logitem header */
struct pt_logitem_header {
    enum pt_logitem_kind kind;
    unsigned int size;
};
/* type process */
struct pt_logitem_process {
    struct pt_logitem_header header;
    unsigned long tgid;                 // process id
    unsigned long cmd_size;             // the size of command string followed to launch this process
};
/* type thread */
struct pt_logitem_thread {
    struct pt_logitem_header header;
    unsigned long tgid;                 // process id
    unsigned long pid;                  // thread id
};
/* type xpage */
struct pt_logitem_xpage {
    struct pt_logitem_header header;
    unsigned long tgid; // process id
    unsigned long base; // the base address where executable pages were mapped
    unsigned long size; // the total size of the executable pages
};
/* type buffer */
struct pt_logitem_buffer {
    struct pt_logitem_header header;
    unsigned long tgid; // process id
    unsigned long pid; // thread id
    unsigned long sequence; // a per-thread sequence number
    unsigned long size; // the total size of PT packets followed
};

perf record是否能够创建这种类型的跟踪,或类似的东西?

1 个答案:

答案 0 :(得分:0)

支持英特尔处理器跟踪(英特尔PT,可在英特尔第五代Core Broadwell,第六代Skylake以及Goldmont Atoms:Intel Joule和Apollo Lake中使用)计划在4.1(内核部分)和4.3中添加性能(用户空间部分)Linux内核版本:https://lwn.net/Articles/648154/“向Linux添加处理器跟踪支持”,2015年7月:

  

处理器跟踪(PT)是一种新的跟踪机制,用于跟踪CPU上执行的分支,从而可以重建所有已执行代码的控制流。英特尔CPU有一个名为BTS(分支跟踪存储)的旧机制,它也允许分支跟踪,但它很慢并且没有广泛使用。 PT允许以更好的性能进行跟踪,并收集其他信息,例如时序。 Broadwell CPU支持Intel Processor Trace。有关更多信息,请参阅“英特尔架构软件开发人员手册”第3卷第36章中的“处理器跟踪”规范。

     

4.1内核在内核的perf_events子系统中有一个Processor Trace实现,它允许通过perf接口使用PT。用户工具支持尚未完全合并,但预计为4.2。该代码由Alex Shishkin和Adrian Hunter开发,并由Emmanuel Lucet测试。 ...

     

这是一个记录简单程序执行的例子

% perf record -e intel_pt//u ls
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.190 MB perf.data ]

应该有一些方法可以使用perf script / perf script -D或修改[{1}}的perf源或其他解析来提取原始PT日志。

Andi Kleen和Beeman Strong将在2015年追踪峰会上检查https://www.halobates.de/pt-tracing-summit15.pdf“Linux上的英特尔®处理器跟踪”。它在perf.data条记录中显示包含原始PT转储的perf script -D输出(最后一张幻灯片)。

还有简单的英特尔工具可以使用PT:https://github.com/andikleen/simple-pt

  

simple-pt是Linux上英特尔处理器跟踪(PT)的简单实验参考实现。 PT可以在硬件级别跟踪CPU执行的所有分支,并且开销适中。然后,PT解码器使用边带跟踪数据来解码分支迹线。

PERF_RECORD_AUXTRACE
     

simple-pt由

组成      
      
  • 内核驱动程序
  •   
  • % sptcmd -c tcall taskset -c 0 ./tcall cpu 0 offset 1027688, 1003 KB, writing to ptout.0 ... Wrote sideband to ptout.sideband % sptdecode --sideband ptout.sideband --pt ptout.0 | less TIME DELTA INSNs OPERATION 从内核驱动程序收集数据
  •   
  • sptcmd解码PT信息
  •   
  • sptdecode转储原始PT跟踪
  •   
  • 它使用fastdecode PT解码库[https://github.com/01org/processor-trace]
  •   
     

简单PT不支持:

     
      
  • 它不支持长期跟踪更多数据而不适合缓冲区(无中断)(使用libipt
  •   
  • 它不支持任何抽样(使用perf或VTune)
  •   
  • 它需要root权限才能收集数据(使用perf
  •   
  • 它不支持交互式调试(使用perf [7.10+]或硬件调试程序)
  •