Показать класс Objective-C в выходных данных DTrace

Используя следующий скрипт 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.


person Tyilo    schedule 26.04.2013    source источник
comment
Это сложно. friday.com/bbum /2008/01/26/   -  person bbum    schedule 26.04.2013
comment
@bburn Разве это не только для forwardMethod()?   -  person Tyilo    schedule 26.04.2013
comment
@bbum Также DTrace может видеть имя класса, потому что он может фильтровать по имени класса, например. objc$target:*NSDate*::entry {} objc$target:*NSDate*::return {}   -  person Tyilo    schedule 26.04.2013
comment
Имена классов могут присутствовать или отсутствовать из-за того, как работает динамический компоновщик. Dtrace обычно не запускает подкачку памяти, отсюда и хитрость, связанная с копированием имени класса. Кое-что из этого может быть необходимым, а может и не быть, а без него оно может работать лишь иногда. Скорее всего, вам придется изменить свой скрипт, чтобы он выталкивал/извлекал данные вручную, а не полагался на автоматический механизм.   -  person bbum    schedule 26.04.2013


Ответы (2)


Я сделал скрипт, который делает именно то, что я хочу:

#!/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);
}
person Tyilo    schedule 26.04.2013

#!/usr/sbin/dtrace -s
#pragma D option flowindent
objc$target:::entry,
objc$target:::return
{
    trace(probemod);
}

Из Колина Уилера Отладка Cocoa с помощью DTrace.

person vdm    schedule 10.07.2013