как найти значение аргументов в dtrace

код

dtrace -n 'syscall::read:entry /execname != "dtrace"/ { @reads[execname, fds[arg0].fi_pathname] = count(); }'
   dtrace: description 'syscall::read:entry ' matched 1 probe
   ^C
   bash            /proc/1709/psinfo                                                 1
   loader          /zp/space/f2                                                      1
   nscd            /etc/user_attr                                                    1
   bash            /export/home/mauroj/.bash_history                                 2
   loader          /zp/space/f3                                                      2
   nscd            /etc/group                                                        2
   su              /etc/default/su                                                   8
   su              /devices/pseudo/sy@0:tty                                          9
   bash            /dev/pts/5                                                       66
   Xorg            /devices/pseudo/conskbd@0:kbd                                   152
   gnome-terminal  /devices/pseudo/clone@0:ptm                                     254

код трассировки fds[arg0].fi_pathname

как увидеть аргументы вызова dtrace, что это значит, я пытаюсь использовать

trace -lv 'syscall:fds:read:entry' |head
   ID   PROVIDER            MODULE                          FUNCTION NAME
    1     dtrace                                                     BEGIN

    Probe Description Attributes
        Identifier Names: Stable
        Data Semantics:   Stable
        Dependency Class: Common

    Argument Attributes
        Identifier Names: Stable

но не можете найти аргументы? как увидеть, что эти аргументы означают? например fds[arg0].fi_pathname

приведите другой пример:

 dtrace -n 'io:::start { @bytes = quantize(args[0]->b_bcount); }'

как узнать, что args[0]->b_count означает байты системного вызова


person fuyou001    schedule 30.12.2013    source источник
comment
Поскольку ваш вопрос касается DTrace, который существует на разных платформах, вам следует удалить тег linux.   -  person Robert Harris    schedule 30.12.2013


Ответы (1)


Как поясняется в документации, для проверки входа поставщика системных вызовов , arg0, arg1 и т. д. сами являются аргументами системного вызова. Для syscall::read:entry просмотр справочной страницы read(2) показывает

 ssize_t read(int fildes, void *buf, size_t nbyte);

и поэтому arg0 является значением fildes.

К сожалению, fds[] не описан в официальной документации. fds[] — это нечто похожее на подпрограмму, которую DTrace предоставляет для translate дескриптор файла в fileinfo_t. fileinfo_t — это стабильная структура, которая предоставляет полезную информацию о файле, не раскрывая подробности реализации пользователю.

В документации для провайдера ввода-вывода указано, что для io:::start , args[0] является указателем на struct buf. Это еще одна ошибка документации: на самом деле это указатель на struct bufinfo, который описан на той же странице.

person Robert Harris    schedule 30.12.2013