我该如何运行这个DTrace脚本来对我的应用程序进行性能分析?

3

我在网上搜索了一些东西,希望能帮助我进行流水线分析。我搜索并在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个回答

4
如果您只是想运行这个特定的DTrace脚本,只需将其保存到.d脚本文件中,然后使用以下命令来针对已编译的可执行文件运行它:
sudo dtrace -s dtracescript.d -c [Path to executable]

dtracescript.d替换为您的脚本文件名。

假设您的系统中已经包含了DTrace(我正在运行Mac OS X,自从Leopard版本以来就有它)。

如果您想了解这是如何工作的,我之前曾为MacResearch写过一篇关于使用DTrace的教程,分为两部分,可以在此处此处找到。


非常感谢!我实际上非常好奇看看代码的解释!我有Linux Ubuntu...如果DTrace不是Ubuntu的一部分,我会安装它...编译后的代码需要任何标志吗?像gcc -pg还是不一定? - Syntax_Error
@Syntax_Error - DTrace需要在内核级别存在,但由于许可问题,它似乎不在Linux中:https://dev59.com/GHI95IYBdhLWcg3w_zWs。如果我没记错的话,您的可执行文件不需要任何特殊的编译器设置。至于脚本的作用,我会引导您阅读我链接的文章,因为我在那里描述了一些语法并指出了其他更详细信息的资源。 - Brad Larson

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