Я хочу записать простому подобному 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.* { if(pid() != myOwnPid()) printf("PID: %d\tNAME: %s\tARGSTR: %s\n",pid(), name, argstr); }
Но я не знаю pid предоставления функции выполнения stap сценарий.
Если вы хотите исключить из строки процессов системной атаки собственное пользовательское пространство stapio
/staprun
, используйте stp_pid()
:
if (pid() != stp_pid())
printf("...")
См. также man функцию::stp_pid
.
perf trace -a -e open,close,read,write
Он будет фильтровать свои собственные вызовы, используйте -o output
для сохранения вывода, как и с strace
.
perf trace -h
Чтобы увидеть, как фильтровать некоторые pid (xterm, X.org, ssh и т. д.) и как указать только группу cpus, pid, смешать их с точками трассировки, ошибками страниц, получить callchains из любого события и т. д.