OSX:基于dtruss脚本的dtrace printf(),write_nocancel()输出

时间:2015-09-29 01:20:23

标签: macos printf dtrace dtruss

我需要看到我的程序的printf输出与dtrace输出同步。

我喜欢构建自己的dtrace命令版本,该命令会产生“ sudo dtruss -t write_nocancel ls ”命令的等效输出。

这是“正确的dtruss命令/输出”:

sudo dtruss -t write_nocancel ls
Chap1   Chap10  Chap11  Chap12  Chap2   Chap3   Chap4   Chap5   Chap6   Chap7   Chap8   Chap9   README
SYSCALL(args)        = return
write_nocancel(0x1, "Chap1\tChap10\tChap11\tChap12\tChap2\tChap3\tChap4\tChap5\tChap6\tChap7\tChap8\tChap9\tREADME\n\0", 0x52)       = 82 0

基于查看dtruss脚本源代码,我尝试了这个dtrace命令,但它失败了。

    sudo  dtrace -q \
    -n '*:*:write_nocancel:entry {self->arg0=arg0; self->arg1 =arg1; \
    self->arg2 =arg2; self->code=0; } ' \
            -n '*:*:write_nocancel:return { \
        printf("return %s(0x%X, \"%S\", 0x%X)         = %d %d", \
        probefunc,self->arg0,       arg0 == -1 ? "" : stringof(copyin(self->arg1,arg0)),self->arg2,(int)arg0, \
  (int)errno); }' \
             -c ls   2>&1 
                Chap1
                Chap10
                Chap11
                Chap12
                Chap2
                Chap3
                Chap4
                Chap5
                Chap6
                Chap7
                Chap8
                Chap9
                README
                dtrace: error on enabled probe ID 3 (ID 209288: fbt:mach_kernel:write_nocancel:return): invalid address (0xffffff80218dfc40) in action #3 at DIF offset 92
                dtrace: error on enabled probe ID 4 (ID 958: syscall::write_nocancel:return): invalid address (0xffffff80218dfc40) in action #3 at DIF offset 92
                dtrace: error on enabled probe ID 3 (ID 209288: fbt:mach_kernel:write_nocancel:return): invalid address (0xffffff801a7c0010) in action #3 at DIF offset 92

任何dtrace专家都可能对如何解决这个问题有所了解?

1 个答案:

答案 0 :(得分:1)

找到答案:(两个-n选项的问题)。

sudo  dtrace -q -n \
    'syscall::write_nocancel:entry{self->start = 1; \
        self->vstart = 1; self->arg0 = arg0; \
        self->arg1 = arg1; self->arg2 = arg2;}   \
    *:*:write_nocancel:return /self->start/ \
    { printf("return %s(0x%X, \"%S\", 0x%X)         = %d %d" \
        ,probefunc,self->arg0,      \
        arg0 == -1 ? "" : stringof(copyin(self->arg1,arg0)),\
        self->arg2,(int)arg0,   (int)errno); }' \
    -c ls   2>&1