加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 用于部分程序的perf stat

发布时间:2020-12-13 19:18:08 所属栏目:Linux 来源:网络整理
导读:是否可以通过perf收集硬件计数器统计信息,仅用于程序执行的一部分?如果是这样,怎么样? likwid提供了能够定义命名区域的功能,但如果在安装了perf的系统上可以实现这一点,那将会很棒. 以前的一些问题已经回复了相关答案,但仍有一些缺点: Using probe我得到
是否可以通过perf收集硬件计数器统计信息,仅用于程序执行的一部分?如果是这样,怎么样?

likwid提供了能够定义命名区域的功能,但如果在安装了perf的系统上可以实现这一点,那将会很棒.

以前的一些问题已经回复了相关答案,但仍有一些缺点:

> Using probe我得到了同样的错误,我使用的是一个稍新的内核(3.13).这些修补程序是否在较新版本中可用?
> Using perf_event_open我想保持在命令行上定义事件的灵活性.我还看了一眼perf stat itself的代码,但似乎没有通过调用perf_event_open进行设置.

解决方法

生成子进程以运行perf stat.
将perf stat附加到父级.
在需要时从父级杀死子进程.
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

int main()
{

    int pid= getpid();
    int cpid = fork();


    if( cpid == 0)
    {
        // child process .  Run your perf stat
        char buf[50];
        sprintf(buf,"perf stat -p %d   > stat.log 2>&1",pid);
        execl("/bin/sh","sh","-c",buf,NULL);

    }
    else
    {
        // set the child the leader of its process group
        setpgid(cpid,0);

        //////////////////////////////////////////////
        // part of program you wanted to perf stat
        sleep(3);
        ////////////////////////////////////////////////


        ////////////////////////////////////////////////////////////////
        // stop perf stat by killing child process and all its descendants(sh,perf stat etc )
        kill(-cpid,SIGINT);
        ////////////////////////////////////////////////////////////////////


        // rest of the program
        sleep(2);
     }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读