2017-12-16 20 views
0

perf의 소스 코드를 읽고 의미를 알아 봅니다. perf record의 가상 메모리 주소는 다음과 같습니다. 예를 들어 call test의 가상 주소 인 perf report의 주석으로 지켜본 어셈블리 코드 인 대상 프로세스의 지침입니다. 퍼포먼스가 퍼포먼스를 만들어서 카운터를 트리거하는 명령어의 가상 주소를 저장하는 데 사용되는 데이터 구조는 무엇입니까?perf 레코드가 대상 프로세스의 명령어의 가상 메모리 주소를 얻는 방법과 perf를 사용하여 데이터를 저장하는 데 사용되는 데이터 구조체가 무엇입니까?

+0

어느 레벨에서 대답 하시겠습니까? 'perf record' 유저 랜드 툴, 커널의'perf_event_open' 구현에 관심이 있으십니까? – Zulan

+0

하드웨어 카운터를 트리거하는 명령어의 가상 주소를 받아서 인쇄하고 싶습니다. 특히, TSX를 중지시키는 명령이 있으며 하드웨어 이벤트 카운터에 의해 tx-abort 이벤트가 카운트됩니다. 'perf report'가 나올 때, 나는 'perf annotation'에 의해 그것을 볼 수있다. 그래서'perf record '를 실행할 때 어떤 데이터 구조가 그 명령어의 가상 주소를 저장하는지 알고 싶습니다. 아니면 perf_event_open이 이것을 어떻게 달성 할 수 있는지 아십니까? – Sam

+0

분석을 완료하고 싶습니까? 그런 다음'perf record' /'perf script'를 사용하고 맨 페이지를 읽어야합니다. 또는 특정 도구를 작성 하시겠습니까? 그럼 왜? 'perf_event_open'에 기반한이 새로운 도구는'perf record'가 할 수없는 것은 무엇입니까? – Zulan

답변

1

샘플의 명령어 포인터를 가져 오려면 perf_event_open 호출의 경우 perf_attr.sample_typePERF_SAMPLE_IP을 포함시켜야합니다. 여기에는 PERF_RECORD_SAMPLE 구조의 ip 필드가 mmap ringbuffer에서 읽을 수 있습니다. 자세한 내용은 맨 페이지를 참조하십시오.

PERF_RECORD_SAMPLE 
    This record indicates a sample. 

     struct { 
      struct perf_event_header header; 
      u64 sample_id; /* if PERF_SAMPLE_IDENTIFIER */ 
      u64 ip;   /* if PERF_SAMPLE_IP */ 
      u32 pid, tid; /* if PERF_SAMPLE_TID */ 
      u64 time;  /* if PERF_SAMPLE_TIME */ 
      ...