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