SystemTap - фильтровать собственные системные вызовы (трассировка всей системы)
Я хочу написать простой скрипт в стиле strace, используя SystemTap. Основная цель - перехватить только некоторые системные вызовы (например, open, close, read, write и т. Д.) Для всех процессов в системе. (Невозможно сделать это с помощью strace, потому что вся система strace'а равна мгновенному зависанию системы).
На данный момент это выглядит так:
#!/usr/bin/env stap
probe syscall.*
{
printf("PID: %d\tNAME: %s\tARGSTR: %s\n",pid(), name, argstr);
}
Проблема начинается, когда я хочу сохранить вывод в файл. Сценарий Stap постоянно записывает себя в файл, поэтому он никогда не завершает цикл.
Я думаю, что решение будет что-то вроде этого:
#! / usr / bin / env stap зонд системного вызова. * { if (pid ()! = myOwnPid ()) printf ("PID:% d \ tNAME:% s \ tARGSTR:% s \ n", pid (), name, argstr); }
Но я не знаю ни одной функции, позволяющей запустить сценарий stap.
2 ответа
Если вы хотите исключить собственное пространство пользователя systemtap stapio
/staprun
процессы от Strace, используйте stp_pid()
:
if (pid() != stp_pid())
printf("...")
Смотрите также man function::stp_pid
,
perf trace -a -e open,close,read,write
Он будет фильтровать свои звонки, использовать -o output
чтобы сохранить вывод, как с strace
,
perf trace -h
Чтобы узнать, как фильтровать некоторые pids (xterm, X.org, ssh и т. Д.) И как указать только группу процессоров, pids, смешать ее с точками трассировки, ошибками страниц, получить цепочки вызовов из любого события и т. Д.