SystemTap - отфильтруйте владеют syscalls (трассировка в масштабе всей системы)

Я хочу записать простому подобному 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 сценарий.

0
задан 23 February 2015 в 22:09
2 ответа

Если вы хотите исключить из строки процессов системной атаки собственное пользовательское пространство stapio/staprun, используйте stp_pid():

if (pid() != stp_pid())
    printf("...")

См. также man функцию::stp_pid.

0
ответ дан 4 December 2019 в 13:53
perf trace -a -e open,close,read,write 

Он будет фильтровать свои собственные вызовы, используйте -o output для сохранения вывода, как и с strace .

perf trace -h

Чтобы увидеть, как фильтровать некоторые pid (xterm, X.org, ssh и т. д.) и как указать только группу cpus, pid, смешать их с точками трассировки, ошибками страниц, получить callchains из любого события и т. д.

2
ответ дан 4 December 2019 в 13:53

Теги

Похожие вопросы