如何在采样模式下使用perf_event_open读取BRANCH STACK的值?

时间:2019-07-26 05:23:16

标签: branch sample perf

我在采样模式下使用perf_event_open()对分支堆栈的值进行采样,但是我不知道为什么!

attr.sample_type=PERF_SAMPLE_IP|PERF_SAMPLE_BRANCH_STACK

如果我没有将PERF_SAMPLE_BRANCH_STACK设置为attr.sample_type,一切都很好!我不知道为什么!

     static int perf_event_open(struct perf_event_attr *attr,
         pid_t pid,int cpu,int group_fd,unsigned long flags)
     {
         return syscall(__NR_perf_event_open,attr,pid,cpu,group_fd,flags);
     }

     int main(int argc, char** argv)
    {

        pid_t pid = 0;
       // create a perf fd
        struct perf_event_attr attr;
        memset(&attr,0,sizeof(struct perf_event_attr));
        attr.size=sizeof(struct perf_event_attr);
    // disable at init time
        attr.disabled=1;
    // set what is the event
        attr.type=PERF_TYPE_HARDWARE;
        attr.config=PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
    // how many clocks to trigger sampling
        attr.sample_period=1000000;
    // what to sample is IP
        attr.sample_type=PERF_SAMPLE_IP|PERF_SAMPLE_BRANCH_STACK;
    // notify every 1 overflow

        attr.wakeup_events=1;
        attr.branch_sample_type = PERF_SAMPLE_BRANCH_ANY_RETURN;
    // open perf fd
        int perf_fd=perf_event_open(&attr,pid,-1,-1,0);
        if(perf_fd<0)
        {
            perror("perf_event_open() failed!");
            return errno;
        }
  

失败!错误:不支持该操作!

2 个答案:

答案 0 :(得分:0)

  

错误:不支持该操作

perf_event_open() manual page说出此错误:

       EOPNOTSUPP
              Returned if an event requiring a specific hardware feature is
              requested but there is no hardware support.  This includes
              requesting low-skid events if not supported, branch tracing if
              it is not available, sampling if no PMU interrupt is
              available, and branch stacks for software events.

关于PERF_SAMPLE_BRANCH_STACK,它说:

          PERF_SAMPLE_BRANCH_STACK (since Linux 3.4)
                 This provides a record of recent branches, as provided
                 by CPU branch sampling hardware (such as Intel Last
                 Branch Record).  Not all hardware supports this fea‐
                 ture.

因此,看来您的硬件不支持此功能。

答案 1 :(得分:0)

我可以想到在您的情况下发生该错误的三个原因:

  • 您正在IBM POWER处理器上运行代码。在这些处理器上,PERF_SAMPLE_BRANCH_STACK受支持,并且硬件中支持某些分支过滤器,但是当前任何POWER处理器均不支持PERF_SAMPLE_BRANCH_ANY_RETURN。您说通过删除PERF_SAMPLE_BRANCH_STACK可以使代码正常工作,但这并不能告诉我们问题是来自PERF_SAMPLE_BRANCH_STACK还是PERF_SAMPLE_BRANCH_ANY_RETURN
  • 您正在虚拟机监控程序(例如KVM)上运行代码。大多数管理程序(如果不是全部)都不会虚拟化分支采样。然而,主机处理器实际上可能支持分支采样,甚至可能支持ANY_RETURN过滤器。
  • 处理器不支持分支采样功能。其中包括比奔腾4更早的英特尔处理器。

并非所有的英特尔处理器都在硬件中支持ANY_RETURN过滤器。从Core2开始支持此过滤器。但是,在Intel处理器上,对于硬件不支持的分支过滤器,Linux提供了软件过滤,因此PERF_SAMPLE_BRANCH_ANY_RETURN仍应在这些处理器上工作。

我可能还有其他原因错过了。