Назад | Перейти на главную страницу

SystemTap - фильтровать собственные системные вызовы (общесистемная трассировка)

Я хочу написать простой скрипт, похожий на 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.