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

最佳答案

为了获得样本的指令指针,必须在PERF_SAMPLE_IP调用中包含perf_attr.sample_type。这将在perf_event_open事件的结构中包含ip字段,您可以从PERF_RECORD_SAMPLE环形缓冲区读取该字段。有关详细信息,请参阅手册页。

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

关于c - 性能记录如何获取目标进程的指令的虚拟内存地址以及性能用于存储的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47846868/

10-11 18:39