perf记录如何获取目标进程的指令的虚拟内存地址以及用于存储它的数据结构

我正在阅读perf的源代码,并尝试理解perf record如何获取触发perf计数的目标进程的指令的虚拟内存地址(例如, call test的虚拟地址,即汇编代码监视通过perf report的注释)。 什么数据结构用于存储使perf事件发生并触发计数器的指令的虚拟地址?

要获取样本的指令指针,必须在perf_attr.sample_type包含PERF_SAMPLE_IP以进行perf_event_open调用。 这将包括您可以从mmap ringbuffer读取的PERF_RECORD_SAMPLE事件的结构中的ip字段。 有关详细信息,请参见联机帮助

 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 */ ...