В
DTrace есть довольно много очень полезных встроенных переменных.
Полный их список приведён
здесь, а пока я расскажу лишь про несколько из них. В этой заметке мы рассмотрим простейшие переменные, а в последующих записях постепенно научимся использовать и более сложные.
Позволю себе разбить переменные на несколько групп. Помимо имени переменной, я также приведу её тип. Итак:
1) Имена файлов и каталогов
string
cwd - имя текущего каталога того процесса, которому принадлежит текущий thread
string
execname - символьное имя, которое было передано функции exec(2) для исполнения текущего процесса.
2) Процессы
id_t
tid - номер текущего thread'а. Для thread'ов пользовательских процессов, это значение будет равно результату вызова
pthread_self(3C).
pid_t
pid - идентификатор процесса (PID) текущего процесса
pid_t
ppid - parent PID текущего процесса
uid_t
uid - пользовательский ID текущего процесса
gid_t
gid - идентификатор группы (group ID) текущего процесса
3) Пробы
uint_t
id - ID номер текущей пробы. Это тот самый номерок, что видно в таблице доступны проб при вызове команды
dtrace -l
string
probefunc - имя функции согласно описанию текущей пробы
string
probemod - имя модуля согласно описанию текущей пробы
string
probename - имя пробы согласно описанию текущей пробы
string
probeprov - имя провайдера согласно описанию текущей пробы
4) Прочее
int
errno - код ошибки, возвращённый последним системным вызовом, выполненным текущим thread'ом
uint64_t
timestamp - текущее время счётчика наносекунд. Данный счётчик не привязан к текущему времени в системе, и потому должен использоваться только для относительных вычислений.
Использовать эти переменные можно как угодно - один из простейших вариантов применения приведён ниже. Я привожу полный текст скрипта, поэтому если вы его сохраните под именем script.d и сделаете этому файлу
chmod u+x ./script.d, то его можно будет запускать прямо из командной строки. Пока не обращайте внимания на строку с pragma D option, про несколько полезных опций DTrace я расскажу через несколько дней.
ВНИМАНИЕ: в целях компактного размещения кода, я разбил длинные строки с printf на несколько строк. Если вы хотите запустить данный скрипт, вам следует склеить такие строки.
CODE:
#!/usr/sbin/dtrace -s
#pragma D option quiet
:::write:entry
{
printf("\nProcess info:\ntid=%d,
pid=%d, ppid=%d, uid=%d, gid=%d\n",
tid, pid, ppid, uid, gid);
printf("CWD=%s, execname=%s\n", cwd, execname);
printf("Probe info:\nid=%d, probeprov=%s,
probemod=%s, probefunc=%s, probename=%s\n",
id, probeprov, probemod, probefunc, probename);
}
Запущенный на вашей машине, данный скрипт выдаст вам примерно следующее (будет ОЧЕНЬ много строк, так как мы ловим, согласно шаблону, все обращения к вызову
write):
CODE:
Process info:
tid=1, pid=22157, ppid=21995, uid=123, gid=10
CWD=/export/greys/./dtrace, execname=dtrace
Probe info:
id=6295, probeprov=fbt, probemod=genunix, probefunc=write, probename=entry
Process info:
tid=1, pid=21993, ppid=21450, uid=123, gid=10
CWD=/home/gr128638, execname=rxvt
Probe info:
id=12, probeprov=syscall, probemod=, probefunc=write, probename=entry
Defined tags for this entry:
dtrace