Трассировка границ функций в OSX с DTrace

У меня ужасно трудное время, пытаясь отследить все функции с помощью dtrace (или dapptrace) в OSX 10.11.3.

На этой странице dtrace (от 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/
{
}

Как я могу запустить это с недолгой программой, как привет мир, чтобы начать? Я бы догадался

➜ 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 работает, если я изменю ссылку на libc.so на libsystem_c.dylib.

Похоже, что dapptrace тоже не работает.

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

Добавление -U печатает много мусора, не уверен, что это даже полезно (я не видел мой вызов put, или любой fprintf или write).

Теперь я знаю, что DTrace и, в частности, dtruss точно не сломаны в OSX. Что я делаю неправильно?

1 ответ

Возможно, поздно, но главная проблема, кажется, в том, что вы не указали правильно аргумент $1:

Макропеременная $1 раскрывается до первого операнда в командной строке. Эта макропеременная является идентификатором процесса для отслеживания процесса.

Если вы используете -cзатем вместо pid$1 вы можете использовать pid$target, который автоматически использует PID порожденного процесса.

Что касается dapptrace, похоже, у него есть проблема в OS X: вам нужно добавить -Z к вызову dtrace внутри сценария dapptrace (строка 258). https://www.mail-archive.com/dtrace-discuss%40opensolaris.org/msg03808.html

Другие вопросы по тегам