如何运行此DTrace脚本来分析我的应用程序?

时间:2011-01-06 12:51:29

标签: c scripting assembly profiling dtrace

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

1 个答案:

答案 0 :(得分:4)