微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

perf_event_open 权限被拒绝,除了使用 sudo 或更改 perf_event_paranoid 文件之外,还有其他方法吗?

如何解决perf_event_open 权限被拒绝,除了使用 sudo 或更改 perf_event_paranoid 文件之外,还有其他方法吗?

我能找到的有关该主题的唯一信息是此链接perf_event_open always returns -1,根据我的理解,它建议使用 CONfig_HW_PERF_EVENTS 进行配置,但我仍然遇到同样的问题。

我正在实施一个perf_event_open 手册页启发的程序:

static long
       perf_event_open(struct perf_event_attr *hw_event,pid_t pid,int cpu,int group_fd,unsigned long flags)
       {
           int ret;

           ret= syscall(__NR_perf_event_open,hw_event,pid,cpu,group_fd,flags);
           return ret;
       }
struct perf_event_attr pe;

int pid = fork();

if (pid > 0 ) {

memset(&pe,sizeof(pe));
           pe.type = PERF_TYPE_HARDWARE;
           pe.size = sizeof(pe);
           pe.config = PERF_COUNT_HW_cpu_CYCLES;
           pe.disabled = 0;
           pe.exclude_kernel = 0;
           pe.exclude_hv = 0;   
            
           fd = perf_event_open(&pe,-1,0);
if (fd == -1) {
               perror(0);
              exit(EXIT_FAILURE);
           }
}

我总是得到 fd 的 -1 返回值,而 perror 表示权限被拒绝。

当然我可以使用 sudo 来解决这个问题,但是还有其他方法可以允许执行 perf_event_open 的权限吗?

PS:我不想更改 perf_event_paranoid 文件,这会使程序在设置为 -1 时工作;我假设它会在 2。

解决方法

RETURN VALUE section of the Linux perf_event_open() system call 部分说明:

   ...

   EACCES Returned when the requested event requires CAP_PERFMON
          (since Linux 5.8) or CAP_SYS_ADMIN permissions (or a more
          permissive perf_event paranoid setting).  Some common
          cases where an unprivileged process may encounter this
          error: attaching to a process owned by a different user;
          monitoring all processes on a given CPU (i.e.,specifying
          the pid argument as -1); and not setting exclude_kernel
          when the paranoid setting requires it.

   ...

   EPERM  Returned on many (but not all) architectures when an
          unsupported exclude_hv,exclude_idle,exclude_user,or
          exclude_kernel setting is specified.

          It can also happen,as with EACCES,when the requested
          event requires CAP_PERFMON (since Linux 5.8) or
          CAP_SYS_ADMIN permissions (or a more permissive perf_event
          paranoid setting).  This includes setting a breakpoint on
          a kernel address,and (since Linux 3.13) setting a kernel
          function-trace tracepoint.

根据发布的示例代码,鉴于您对偏执设置的声明,值 pe.exclude_kernel = 0;pe.exclude_hv = 0; 可能会导致权限问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。