我在网上搜索了一些东西,希望能帮助我进行流水线分析。我搜索并在http://www.webservertalk.com/message897404.html找到了一些内容。
这个问题有两个部分:找到特定类型的所有指令(inc、add、shl等),以确定分组,然后找出哪些指令正在执行并正确地求和。第一部分很棘手,除非通过反汇编器进行分组足够。对于找出哪些指令正在执行,Dtrace当然是你的好朋友(至少在用户空间)。
最好的方法是只对每个基本块的开始进行检测;目前找到这些基本块还需要手动处理...但是,对于小型应用程序来说,检测每个指令是可行的。以下是一个示例:
首先,我们要测试的C程序相当简单:
main()
{
int i;
for (i = 0; i < 100; i++)
getpid();
}
现在让我们来看一下稍微有些棘手的D脚本:
#pragma D option quiet
pid$target:a.out::entry
/address[probefunc] == 0/
{
address[probefunc]=uregs[R_PC];
}
pid$target:a.out::
/address[probefunc] != 0/
{
@a[probefunc,(uregs[R_PC]-address[probefunc]), uregs[R_PC]]=count();
}
END
{
printa("%s+%#x:\t%d\t%@d\n", @a);
}
main+0x1: 1
main+0x3: 1
main+0x6: 1
main+0x9: 1
main+0xe: 1
main+0x11: 1
main+0x14: 1
main+0x17: 1
main+0x1a: 1
main+0x1c: 1
main+0x23: 101
main+0x27: 101
main+0x29: 100
main+0x2e: 100
main+0x31: 100
main+0x33: 100
main+0x35: 1
main+0x36: 1
main+0x37: 1
从给定的例子来看,这正是我所需要的。然而我不知道它在做什么,如何保存DTrace程序,如何使用我想要获取结果的代码执行它。因此,我打开这个希望一些有很好的DTrace背景的人能够帮助我理解代码、保存它、运行它并希望能够显示结果。