我正在尝试使用linux perf工具监视特定功能期间的性能统计信息。
我正在按照https://perf.wiki.kernel.org/index.php/Jolsa_Features_Togle_Event#Example_- _using_u.28ret.29probes上给出的说明进行操作
我试图获得一个简单的C程序的指令计数。(如下所示)
1)我的简单C代码
#include<stdio.h> int sum=0; int i=0; void func(void) { for(i=0;i<100;i++) { sum=sum+i; } } int main(void) { func(); return 0; }
2)编译和添加探针
root@sunimal-laptop:/home/sunimal/temp# gcc -o ex source.c root@sunimal-laptop:/home/sunimal/temp# perf probe -x ./ex entry=func Added new event: probe_ex:entry (on 0x4ed) You can now use it in all perf tools, such as: perf record -e probe_ex:entry -aR sleep 1 root@sunimal-laptop:/home/sunimal/temp# perf probe -x ./ex exit=func%return Added new event: probe_ex:exit (on 0x4ed%return) You can now use it in all perf tools, such as: perf record -e probe_ex:exit -aR sleep 1
3)尝试使用perf stat来测量func()函数中的指令计数。这会导致错误。
root@sunimal-laptop:/home/sunimal/temp# perf stat -e instructions:u,probe_ex:entry/on=instructions/,probe_ex:exit/off=instructions/ ./ex invalid or unsupported event: 'instructions:u,probe_ex:entry/on=instructions/,probe_ex:exit/off=instructions/' Run 'perf list' for a list of valid events
有人可以指出我做错了什么吗?
[我使用的是Linux内核3.11.0-12-通用]
我认为您遵循的说明尚未包含在主线Linux内核中。结果,perf告诉您不支持该事件:perf不知道此页面上提到的“切换”机制。
我可以看到两种解决方法:
git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/jolsa/perf
git co remotes/origin/perf/core_toggle
关于2,我对内核版本和开发完全不熟悉,我认为此解决方案的使用和维护可能非常复杂。也许您应该在perf用户邮件列表上询问是否有将切换功能集成到主线内核中的计划。