Я пытался сэмплировать события 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. Командная строка перф работает.