DTrace(全称Dynamic Tracing),也称为动态跟踪,是由 Sun™ 开发的一个用来在生产和试验性生产系统上找出系统瓶颈的工具,可以对内核(kernel)和用户应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险的技术。在任何情况下它都不是一个调试工具, 而是一个实时系统分析寻找出性能及其他问题的工具。 DTrace 是个特别好的分析工具,带有大量的帮助诊断系统问题的特性。还可以使用预先写好的脚本利用它的功能。 用户也可以通过使用 DTrace D 语言创建他们自己定制的分析工具, 以满足特定的需求,DTrace是过去十年中在操作系统方面最具意义的革新之一。Solaris中分散着30,000多的位置指针,也叫探测器probes,DTrace可激活成千上万的探测器,记录所关注的位置指定的数据,如命中,即可从该地址显示用户进程或系统内核的数据,从而了解系统。
有测试表明dtrace对系统性能影响非常小(下降0.5%);truss影响非常大(下降73%),另外dtrace有自己的d语言,有聚合函数等可以使用会使debug更方便,最后相比truss,strace,itrace工具(仅可以跟踪系统调用),dtrace不仅可以跟踪系统调用,还可以跟踪用户自定义函数。
1.首先我们用c模拟一个服务器端的守护进程; 这个应用逻辑很简单,循环调用a(),b()函数,其中a()函数又调用了a_1()函数;a(),a_1(),b()三个都是空函数,没有任何实际算法,见源码mydtrace.c
#include <stdio.h>
void a();
void a_1();
void b();
int main ()
{
while (1)
{
a();
b();
sleep(1);
}
}
void a()
{
a_1();
}
void a_1()
{
}
void b()
{
}
2.编译&运行此应用
root@IPS_TEST # gcc mydtrace.c -o mydtraced
root@IPS_TEST # ./mydtraced
3.编写跟踪mydtrace程序的探测脚本,见mydrace.sh
#!/usr/sbin/dtrace -s
#pragma D option quiet
pid$target:mydtraced::entry
{
printf("-->%s\n", probefunc);
}
pid$target:mydtraced::return
{
printf("<--%s\n", probefunc);
}
4.运行此脚本,查看输出结果;输出完美的剖析了mydtraced进程的内部调用逻辑
root@IPS_TEST# ./mydtrace.sh -p `pgrep mydtraced`
–>a
–>a_1
<–a_1
<–a
–>b
<–b
–>a
–>a_1
<–a_1
…….
dtrace更多细节,请参见<<Solaris动态跟踪指南.pdf>>