当前位置: 首页 > 工具软件 > DTrace > 使用案例 >

solaris dtrace系列一:系统分析调试工具dtrace简介

曾弘扬
2023-12-01

DTrace(全称Dynamic Tracing),也称为动态跟踪,是由 Sun™ 开发的一个用来在生产和试验性生产系统上找出系统瓶颈的工具,可以对内核(kernel)和用户应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险的技术。在任何情况下它都不是一个调试工具, 而是一个实时系统分析寻找出性能及其他问题的工具。 DTrace 是个特别好的分析工具,带有大量的帮助诊断系统问题的特性。还可以使用预先写好的脚本利用它的功能。 用户也可以通过使用 DTrace D 语言创建他们自己定制的分析工具, 以满足特定的需求,DTrace是过去十年中在操作系统方面最具意义的革新之一。Solaris中分散着30,000多的位置指针,也叫探测器probes,DTrace可激活成千上万的探测器,记录所关注的位置指定的数据,如命中,即可从该地址显示用户进程或系统内核的数据,从而了解系统。

一.为什么要用dtrace(linux:systemtap) 而非truss(linux:strace,ltrace)等工具?

有测试表明dtrace对系统性能影响非常小(下降0.5%);truss影响非常大(下降73%),另外dtrace有自己的d语言,有聚合函数等可以使用会使debug更方便,最后相比truss,strace,itrace工具(仅可以跟踪系统调用),dtrace不仅可以跟踪系统调用,还可以跟踪用户自定义函数。

二.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>>

 类似资料: