OSX中的函数边界跟踪与DTrace

时间:2016-03-19 21:55:34

标签: macos dtrace

我在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会打印出大量垃圾,不确定它是否有用(没有看到我对put的调用,或任何fprintf或写入)。

现在我知道DTrace,特别是dtruss在OSX中肯定没有被破坏。我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

  

$ 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

相关问题