只显示带有Perf annotate的源代码

16

我正在使用Perf进行一些性能测试实验。

然而,我想要针对特定的代码区域知道结果,并且在这种情况下,查看每行源代码(在此情况下为C/C++)的结果(百分比)将简化任务。

perf annotate 有一个视图,其中它显示ASM+源代码,并且还有选择关闭显示源代码的选项。我想知道如何完成此选项的另一端,即仅显示源代码+每行事件百分比,并隐藏ASM输出。这是使用perf可以实现吗?

有其他工具的建议来做到这一点吗?我也在使用Vtune,但我想要做的分析不起作用。Valgrind速度太慢了,所以不考虑。

我使用的是运行Ubuntu 13.04的x64系统。


从http://rotateright.com/zoom获取Zoom的免费30天评估版 - 它以非常优雅的方式完全符合您的要求。 - Paul R
2
尝试使用 Oprofile:http://oprofile.sourceforge.net/examples/ - vinay hunachyal
我很久以前用过 Oprofile,但后来停止了使用。我不记得具体原因,但我猜可能是因为它运行速度慢。不管怎样,它似乎能够满足我的需求。我会再试一下。我也会尝试使用 Zoom 进行实验。 - JohnTortugo
vinay hunachyal:由于我使用Oprofile得到了与Perf相同的结果,因此您可以将其作为答案,并且我会接受它。 - JohnTortugo
@JohnTortugo,你是怎么让perf annotate显示源代码的?我只能看到反汇编代码。我知道这是因为我们没有使用-g选项进行编译,因为它是一个发布二进制文件,我们希望它运行得更快。所以问题来了,是不是只有使用-g选项进行编译才能让perf annotate显示源代码? - Krishna
1个回答

4

很遗憾,perf-annotate 在底层使用了objdump,但是它似乎不能只显示源码(-S暗示-d)。

如果你知道如何使objdump正常工作,请查看tools/perf/util/annotate.c中的symbol__annotate()

snprintf(command, sizeof(command),
         "%s %s%s --start-address=0x%016" PRIx64
         " --stop-address=0x%016" PRIx64
         " -d %s %s -C %s|grep -v %s|expand",
         objdump_path ? objdump_path : "objdump",
         disassembler_style ? "-M " : "",
         disassembler_style ? disassembler_style : "",
         map__rip_2objdump(map, sym->start),
         map__rip_2objdump(map, sym->end+1),
         symbol_conf.annotate_asm_raw ? "" : "--no-show-raw",
         symbol_conf.annotate_src ? "-S" : "",
         symfs_filename, filename);

2
是的,我也是这么想的!不过我决定使用 Oprofile 会更容易一些。 - JohnTortugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接