Одна из самых полезных для меня возможностей в DTrace - это опция
flowindent. Всё, что она делает - это отмечает вход в какую-нибудь функцию с помощью знаков "->", и выход из этой же функции знаками "<-". Казалось бы, что может быть проще - а вы только посмотрите, насколько приятнее выглядит результат!
Данный пример ловит все пробы провайдера fbt. В режиме по умолчанию (а мы будем находиться именно в нём, раз никакими опциями ничего не меняем кроме flowindent) DTrace регистрирует указанные пробы и выводит информацию, когда регистрация этих проб произошла.
Код скрипта:
CODE:
#!/usr/sbin/dtrace -s
fbt:::
/execname == "dtrace"/
{
}
И вот какой мы получаем результат:
CODE:
dtrace: script './try5.d' matched 32659 probes
CPU ID FUNCTION:NAME
1 2027 xc_sync:entry
1 819 xc_do_call:entry
1 1210 mutex_vector_enter:entry
1 1238 lock_set_spl:entry
1 2353 splx:entry
1 15484 apic_setspl:entry
1 15485 apic_setspl:return
1 2354 splx:return
1 1239 lock_set_spl:return
1 1211 mutex_vector_enter:return
1 821 xc_common:entry
1 15510 apic_send_ipi:entry
1 15511 apic_send_ipi:return
...
Стоит лишь добавить к этому скрипту опцию
flowindent (это, кстати, можно также сделать просто добавив -F как параметр командной строки), как ход исполнения кода становится гораздо понятнее:
Новый скрипт:
CODE:
#!/usr/sbin/dtrace -s
#pragma D option flowindent
fbt:::
/execname == "dtrace"/
{
}
И результат:
CODE:
dtrace: script './try5.d' matched 32659 probes
CPU FUNCTION
1 -> xc_sync
1 -> xc_do_call
1 -> mutex_vector_enter
1 -> lock_set_spl
1 -> splx
1 -> apic_setspl
1 <- apic_setspl
1 <- splx
1 <- lock_set_spl
1 <- mutex_vector_enter
1 -> xc_common
1 -> apic_send_ipi
1 <- apic_send_ipi
...
Defined tags for this entry:
dtrace