Как использовать perf_evt_open для получения информации о отдельном процессе - PullRequest
0 голосов
/ 04 июня 2019

Я пытался сэмплировать события ptrace из C. Вот мой код для получения дескриптора файла на perf:

    pid_t pid;
    uint64_t next_offset=0;

    if(argc != 2) {
        fprintf(stderr,"please provide PID");
        exit(EXIT_FAILURE);
    }
    pid = atoi(argv[1]);
    printf("attaching to %d\n", pid);

    memset(&pe, 0, sizeof(struct perf_event_attr));
    pe.type = PERF_TYPE_SOFTWARE;
    pe.size = sizeof(struct perf_event_attr);
    pe.sample_type = PERF_SAMPLE_CPU | PERF_SAMPLE_TID;
    pe.config = PERF_COUNT_SW_CPU_CLOCK;
    pe.disabled = 1;
    pe.sample_freq = 99;
    pe.freq = 1;
    //pe.wakeup_events = 1;

    fd = perf_event_open(&pe, pid, -1, -1, 0);

Прямо сейчас, если я установил pid как сторонний процесс, я не получаю никаких событий. Тем не менее, когда я устанавливаю pid равным 0, я могу читать события из своего собственного процесса. Я нашел следующую строку в справочных страницах для perf_event_open:

Когда pid больше нуля, разрешение на выполнение этого системного вызова регулируется проверкой режима доступа ptrace PTRACE_MODE_READ_REALCREDS;

Я был бы очень признателен за объяснение того, что это значит.

PS: я пытался запустить код от имени root И мой /proc/sys/kernel/perf_event_paranoid равен -1. Командная строка перф работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...