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, смешать ее с точками трассировки, ошибками страниц, получить цепочки вызовов из любого события и т. Д.

Другие вопросы по тегам