在 DTrace 输出中显示 Objective-C 类

Posted

技术标签:

【中文标题】在 DTrace 输出中显示 Objective-C 类【英文标题】:Show Objective-C class in DTrace output 【发布时间】:2013-04-26 14:24:33 【问题描述】:

使用以下 DTrace 脚本,我可以获得接近我想要的输出:

$ cat script.d
objc$target:::entry 
objc$target:::return 
$ sudo dtrace -F -s script.d -c /Applications/TextEdit.app/Contents/MacOS/TextEdit
dtrace: script 'script.d' matched 105896 probes
CPU FUNCTION
  0  -> +load
  0  <- +load
  0  -> +load
  0  <- +load
  0  -> +load
  0  <- +load
  0  -> +load
  0  <- +load
  0  -> +initialize
  0  <- +initialize
  0  -> +alloc
  0    -> +allocWithZone:
  0      -> +self
  0      <- +self
  0      -> +initialize
  0      <- +initialize
  0      -> +initialize
  0      <- +initialize
  0      -> +initialize
  0      <- +initialize
  0      -> +__new:::
  0      <- +__new:::
  0      -> +immutablePlaceholder
  0      <- +immutablePlaceholder
  0    <- +allocWithZone:
  0    -> -initWithObjects:count:
  0      -> +__new:::
  0      <- +__new:::
  0      -> +initialize
  0      <- +initialize
  0      -> +new
  0        -> +alloc
...

我希望输出包含被调用的类,所以它会像这样:

dtrace: script 'script.d' matched 105896 probes
CPU FUNCTION
  0  -> +[classX load]
  0  <- +[classX load]
...

classX 是正确的类。

输出仍然应该是缩进的,并且只包含 Objective-C 消息而不是 C 函数调用。

【问题讨论】:

'这很棘手。 friday.com/bbum/2008/01/26/… @bburn 不是只有forwardMethod()吗? @bbum DTrace 也可以看到类名,因为它可以按类名过滤,例如。 objc$target:*NSDate*::entry objc$target:*NSDate*::return 由于动态链接器的工作方式,类名可能存在也可能不存在。 Dtrace 通常不会触发内存分页,因此与复制类名相关的棘手位。其中一些可能是必要的,也可能不是必要的,如果没有,它可能只会在某些时候起作用。您可能需要修改脚本以手动推送/弹出数据,而不是依赖自动机制。 【参考方案1】:

我做了一个脚本,它完全符合我的要求:

#!/usr/bin/env dtrace -s
#pragma D option quiet

unsigned long long indention;

objc$target:::entry

    method = (string)&probefunc[1];
    type = probefunc[0];
    class = probemod;
    printf("%*s%s %c[%s %s]\n", indention, "", "->", type, class, method);
    indention++;

objc$target:::return

    indention--;
    method = (string)&probefunc[1];
    type = probefunc[0];
    class = probemod;
    printf("%*s%s %c[%s %s]\n", indention, "", "<-", type, class, method);

【讨论】:

【参考方案2】:
#!/usr/sbin/dtrace -s
#pragma D option flowindent
objc$target:::entry,
objc$target:::return

    trace(probemod);

来自Colin Wheeler的Debugging Cocoa with DTrace。

【讨论】:

以上是关于在 DTrace 输出中显示 Objective-C 类的主要内容,如果未能解决你的问题,请参考以下文章

为 Objective-C 对象定义 DTrace 兼容结构

是否可以在 dtrace 中获取 objc 方法的结果?

dtrace 脚本输出是啥意思?

在 Mac 中,执行 Dtrace,但控制台没有可显示的内容

Leopard 上的 DTrace:没有指定探针,即使我指定了探针

如何使用 dtrace 显示每个进程消耗的微秒 cpu?