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

DTraceToolkit脚本解析(5)-syscallbypid.d

syscallbypid.d位于DTraceToolkitProc文件夹下,其功能是根据进程的Process ID,统计syscall Provider的 probe的信息。脚本代码如下(略去版权信息):

#pragma D option quiet

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

syscall:::entry
{
    @num[pid, execname, probefunc] = count();
}

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

阅读全文

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

DTraceToolkit脚本解析(4)-newproc.d

newproc.d位于DTraceToolkitProc文件夹下,其功能是打印新执行的进程名字。脚本代码就一行(略去版权信息):

proc:::exec-success { trace(curpsinfo->pr_psargs); }

脚本代码分析如下:
监听exec-success probe(只有exec系统调用执行成功才会触发这个probe),其中curpsinfopsinfo_t类型变量,pr_psargs成员记录了命令行参数。当probe触发后,打印整个新进程的命令行参数。

执行脚本,输出如下:

bash-3.2# ./newproc.d
dtrac[......]

阅读全文

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

DTrace tricks and tips (16) -利用“-F”选项显示函数调用关系

可以利用DTrace的“-F”选项显示函数之间的调用关系,这对分析代码来说是个绝对好用的工具。以下面脚本为例:

#!/usr/sbin/dtrace -Fs

pid$target:::entry,
pid$target:::return
{
}
syscall:::entry,
syscall:::return
/pid == $target/
{
}

运行脚本:

-bash-3.2# ./debug.d -p 2435
dtrace: script './debug.d' matched 14448 probes
CPU FUNCTION
 12[......]

阅读全文

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

DTrace tricks and tips (15) -通过二级指针访问内存的值

由于DTrace probe在操作系统的kernel空间执行,所以不能直接访问进程user space的内容。通常要使用copyincopyinstr这些函数把进程user space的内容copy出来。如果程序里的变量是个二级指针,就要相对麻烦一些。以下面程序为例(编译成32位的程序,所以指针用uint32_t):

#include <stdio.h>
void func(char **p)
{
        *p = strdup("hello");
        return;
}
int main(void)
{
        char *p[......]

阅读全文

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

DTraceToolkit脚本解析(3)- filebyproc.d

filebyproc.d位于DTraceToolkitProc文件夹下,其功能是打印进程打开的文件名。脚本代码就一行(略去版权信息):

syscall::open*:entry { printf("%s %s", execname, copyinstr(arg0)); }

脚本代码分析如下:
监听所有open相关函数的entry probe,如果触发,就打印进程名(execname)和文件名(arg0)。

执行脚本,输出如下:

root# ./filebyproc.d 
dtrace: script './filebyproc.d' matched 7 probes[......]

阅读全文