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

为什么EBP值变了,EIP值没变?

最近看到一篇古老的帖子(http://thr3ads.net/dtrace-discuss/2008/03/379528-stack-tracing-and-uregs),说是执行完一个把堆栈写坏的函数,为什么DTrace输出EBP的值改变了,但是EIP的值没变?我觉得很有意思,就研究了一下。下面就是整个分析过程:

首先看一下C程序:

#include <stdio.h>

int handle_reply(char *str){
    char response[256];

    strcpy(response,str);

    printf("T[......]

阅读全文

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

DTrace tricks and tips (6) – 访问寄存器

在使用DTrace时,可以通过uregs[]数组访问具体的寄存器。关于各个寄存器的具体的值,可以参考这篇文档:http://docs.oracle.com/cd/E23824_01/html/E22973/gkyeg.html,我就不一一列举了。需要注意的是,有4个通用的寄存器,可以在所有硬件平台上使用:

名字
代表的寄存器

R_PC
程序计数器

R_SP
堆栈指针

R_R0
第一个返回值

R_R1
第二个返回值

最后以一个简单的程序示范一下如何访问寄存器。C程序如下:

#include <s[......]

阅读全文

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

使用DTrace度量redis处理请求的延时

最近在做redis的相关工作,无意中发现Brendan Gregg大神写的度量redis处理请求延时的DTrace脚本:redisslat.d(https://github.com/brendangregg/dtrace-cloud-tools/blob/master/redis/redislat.d),觉得有点意思,就在这里和大家分享一下(省略了一些无关痛痒的注释):

#!/usr/sbin/dtrace -s
/*
 * redislat.d - summarize redis request latency
 *
 * This measures redis[......]

阅读全文

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

在Windows下编写DTrace脚本的注意事项

有些人(比如我自己)习惯在Windows下编写DTrace脚本,然后上传到服务器去执行。但是由于Windows和Unix的文件格式不一样(回车,换行之类的问题),会导致执行脚本不成功。举例来说,我在Windows下编写了DTrace脚本,然后在Solaris执行,就会出现下面的错误:

root@Solaris # ./test.d
: No such file or directory

解决方法是要把脚本转化成Unix格式。我平时习惯用Notepad++,在Notepad++的”编辑->档案格式转换”里就有选项,你可以选择把文件转成Windows或Unix格式。