【问题标题】:function boundary tracing in OSX w/ DTraceOSX 中的函数边界跟踪 w/DTrace
【发布时间】:2016-07-06 13:59:00
【问题描述】:

我很难在 OSX 10.11.3 中使用 dtrace(或 dapptrace)跟踪所有函数。

来自 dtrace 上的this page(日期为 2006 年),看起来这个简单的脚本对于跟踪函数的进入和退出应该很有用:

pid$1::$2:entry
{
    self->trace = 1;
}

pid$1::$2:return
/self->trace/
{
    self->trace = 0;
}

pid$1:::entry,
pid$1:::return
/self->trace/
{
}

我怎样才能在一个短命的程序上运行这个程序,比如 hello world 启动?我早就猜到了:

➜ sudo dtrace -s userfunc.d

dtrace: failed to compile script userfunc.d: line 1: invalid probe description "pid$1::$2:entry": Undefined macro variable in probe description
➜ sudo dtrace -s userfunc.d -c a.out

dtrace: failed to execute a.out: file is set-id or unreadable [Note: the '-c' option requires a full pathname to the file]

➜ sudo dtrace -s userfunc.d -c `pwd`/a.out

dtrace: failed to compile script userfunc.d: line 1: invalid probe description "pid$1::$2:entry": Undefined macro variable in probe description
➜ sudo dtrace -s userfunc.d -c `pwd`/a.out execute

dtrace: failed to compile script userfunc.d: line 1: invalid probe description "pid$1::$2:entry": Undefined macro variable in probe description

如果我将对 libc.so 的引用更改为 libsystem_c.dylib,则跟踪 libc 的第二个示例有效。

dapptrace 似乎也失败了。

➜ sudo dapptrace ./a.out
dtrace: invalid probe specifier
...
: probe description pid16290:a.out::entry does not match any probes

添加-U 会打印很多垃圾,不确定它是否有用(没有看到我对 puts 的调用,或者任何 fprintf 或 write)。

现在我知道 DTrace 尤其是 dtruss 在 OSX 中绝对不会被破坏。我做错了什么?

【问题讨论】:

    标签: macos dtrace


    【解决方案1】:

    可能晚了,但主要问题似乎是您没有正确指定 $1 参数:

    $1 宏变量扩展为命令行上的第一个操作数。此宏变量是要跟踪的进程的进程 ID

    如果您使用-c,那么您可以使用 pid$target 代替 pid$1,它会自动使用衍生进程的 PID。

    至于 dapptrace,它在 OS X 中似乎存在问题:您必须在 dapptrace 脚本(第 258 行)内的 dtrace 调用中添加 -Z。 https://www.mail-archive.com/dtrace-discuss%40opensolaris.org/msg03808.html

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 2023-03-07
      • 2015-07-14
      • 2017-01-26
      • 1970-01-01
      • 2017-01-04
      • 2018-08-24
      • 2014-06-16
      相关资源
      最近更新 更多