是否可以通过perf收集硬件计数器统计信息,仅用于程序执行的一部分?如果是这样,怎么样?
likwid提供了能够定义命名区域的功能,但如果在安装了perf的系统上可以实现这一点,那将会很棒.
以前的一些问题已经回复了相关答案,但仍有一些缺点:
> Using probe我得到了同样的错误,我使用的是一个稍新的内核(3.13).这些修补程序是否在较新版本中可用?
> Using perf_event_open我想保持在命令行上定义事件的灵活性.我还看了一眼perf stat itself的代码,但似乎没有通过调用perf_event_open进行设置.
解决方法
生成子进程以运行perf stat.
将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); } }
原文地址:https://www.jb51.cc/linux/394211.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。