1 Star2 Stars3 Stars4 Stars5 Stars (还没有评分)
Loading...

DTraceToolkit脚本解析(1)- sigdist.d

Sigdist.d位于DTraceToolkitProc文件夹下,其功能是统计一段时间内进程之间发送信号的数量和类型。脚本代码如下(略去版权信息):

#pragma D option quiet

dtrace:::BEGIN
{
    printf("Tracing... Hit Ctrl-C to end.\n");
}

proc:::signal-send
{
    @Count[execname, stringof(args[1]->pr_fname), args[2]] = count();
}

dtrace:::END
{[......]

阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有评分)
Loading...

“arg0…arg9”和args[]

一直以来没太注意“arg0...arg9”和args[]之间的区别,基本就是混用。前几天在调试一个DTrace脚本时,才注意起来,也在DTracemailing list里讨论了一下。以下就是我做的一些总结:

(1) “arg0...arg9”是64位整数类型。如果probe有参数,都可以通过“arg0...arg9”访问。args[]里每个参数的类型与具体的probe相关,probe不一定会提供args[]

(2)可以使用“dtrace -lvn”命令来检查probe是否提供了args[]参数,举个例子:

bash-3.2# dtrace -lvn proc:::signal-[......]

阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有评分)
Loading...

使用DTrace调试进程不能收到信号的问题

前几天,同事提到商用系统上出现过使用kill命令给进程发送SIGKILL信号,进程无法退出的问题。尽管听起来有些不可思议,但是的确发生了。由于当时的环境没有保存下来,所以现在没法debug。我考虑了一下,如果再发生,可以使用DTrace去检查一下问题出现在哪里。

kill命令给进程发送信号可以分成3个步骤:
(1)kill命令成功发送信号;
(2)进程收到信号;
(3)进程开始处理信号。
我们可以用DTrace检查步骤(1)和(2),如果能证明进程的确收到信号,那么十之八九就是程序逻辑的问题了。

首先要做的是检查步骤(1),这个可以使用Brendan Gregg的DTraceTo[……]

阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有评分)
Loading...

DTrace tricks and tips (12) –指定程序链接库作为module的命名规则

有时,我们需要使用DTrace追踪程序的链接库的函数,这时module名字就应该是链接库的名字。什么样的名字是有效的呢?让我做个实验验证一下。

我的程序链接了MySQLclient库,执行下面这些命令:

bash-3.2# dtrace -n 'pid$target::mysql_real_connect:entry' -p 10848
dtrace: description 'pid$target::mysql_real_connect:entry' matched 1 probe
^C

bash-3.2# dtrace -n 'pid$target:mysqlclien[......]

阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有评分)
Loading...

DTrace tricks and tips (11) –如何运行带参数的命令

使用DTrace运行不带参数的命令很简单。假设程序名字叫“a”,执行这个命令即可:“dtrace -n 'pid$target::sigaction:entry' -c ./a”。如果程序需要参数(假设为“-x”),如何运行呢?

试着执行如下命令:

bash-3.2# dtrace -n 'pid$target::sigaction:entry' -c ./a -x
dtrace: option requires an argument -- x

可以看到DTrace会报错。改正方法是用引号把命令和参数引用起来,如下所示:

bash-3.2# dtrace -n 'pid[......]

阅读全文