我在网上搜索可以帮助我进行装配线分析的东西。我在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 背景的人可以帮助我理解代码,保存它,运行它,并希望得到显示的结果。