【问题标题】:OSX: dtrace printf(), write_nocancel() output base on dtruss scriptOSX:dtrace printf()、write_nocancel() 输出基于 dtruss 脚本
【发布时间】:2015-09-29 01:20:22
【问题描述】:

我需要看到我的程序的 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 专家都可能知道如何解决这个问题?

【问题讨论】:

  • 该输出看起来不像 dtrace 命令实际打印的内容。它应该打印出类似“return write_nocancel(0xnnnnnnnn, "...", 0xnnnnnnnnnn = n n" 的内容。那么,嗯,向我们展示一下你真正尝试过并得到了什么?顺便说一句,你为什么使用带有大写 S 的%S ? 这意味着将参数视为指向宽字符串的指针。我怀疑ls 正在写什么。
  • @KenThomases,感谢您的评论。 dtrace 命令输出错误。那是我的问题。 dtruss(基于 dtrace)正确打印字符串参数。我尝试从 dtruss 脚本中提取 dtrace 命令的子集,以使 dtrace 正常工作。但它失败了。我使用了“%S”,因为它在 dtruss 脚本中使用过。我也尝试了“%s”,但也失败了。

标签: macos printf dtrace dtruss


【解决方案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 

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 2015-02-15
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多