【发布时间】: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