Perf 中用于确定库加载地址的机制

The*_*mad 2 linker trace ip-address shared-libraries perf

在后处理期间如何perf确定每个加载图像(例如共享库)的加载地址。例如,perf report使用此信息使每个符号地址相对于每个加载图像的开头。如下图所示 ( unwind: _int_malloc...): 在此输入图像描述

它是否存储在elf二进制或分析输出中的某个位置(即perf.data)?

osg*_*sgx 5

共享库加载地址存储在perf record命令期间记录的 perf.data 文件内。您可以使用perf script -D命令以部分解码的格式从 perf.data 转储数据。当您的程序被加载时ld-linux*.so.2(或者当需要使用 dlopen 时),加载程序将搜索库并使用mmap系统调用加载其段。这些 mmap 事件由内核记录,并在 perf.data 文件中具有 PE​​RF_RECORD_MMAP 或PERF_RECORD_MMAP2类型。And perf report(和perf script) 将重建内存偏移量以解码符号名称。

$ perf record  echo 1
$ perf script -D|grep MMAP -c
7
$ perf script -D|less
PERF_RECORD_MMAP2 ... r-xp /bin/echo
...
PERF_RECORD_MMAP2 ... r-xp /lib/x86_64-linux-gnu/libc-2.27.so
Run Code Online (Sandbox Code Playgroud)

https://github.com/torvalds/linux/blob/master/tools/perf/design.txtperf文件中描述了基本思想。要开始分析,有一个带有参数的系统调用手册页描述了与 mmap 相关的 attr 字段:perf_event_openperf_event_attr *attr

   The perf_event_attr structure provides detailed configuration
   information for the event being created.

                 mmap           : 1,   /* include mmap data */
                 mmap_data      : 1,   /* non-exec mmap data */
                 mmap2          :  1,  /* include mmap with inode data */
Run Code Online (Sandbox Code Playgroud)

Linux 内核在其perf_events子系统(内核/事件)中将记录分析进程所需的事件,并使用 fd 和 mmap 将数据导出到分析器。perf record通常会将此数据从内核转储到 perf.data 文件中,而无需进行大量处理(检查输出的“唤醒 1 次写入数据”打印perf record)。perf_event_mmap_output内核中的 mmap 事件由调用 from记录,perf_event_mmap_event调用 from perf_event_mmap。mmap 系统调用实现mm/mmap.c有一些对perf_event_mmap.

perf 的 design.txt 提到了 munmap,但当前实现没有 munmap 字段或事件,事件代码 2 被重用到PERF_RECORD_LOST。有人认为 munmap 可能会有所帮助https://www.spinics.net/lists/netdev/msg524414.html并链接到https://lkml.org/lkml/2016/12/10/1https:// lkml.org/lkml/2017/1/27/452

perf 工具是 Linux 内核源代码的一部分,可以通过 LXR/elixir 网站在线查看:https ://elixir.bootlin.com/linux/v5.4/source/tools/perf/ mmap/mmap2 事件的处理代码位于perf/util/machine.cmachine__process_mmap_eventmachine__process_mmap2_event; map__new记录的 mmap 参数、返回的地址、偏移量和文件名是在进程 (pid/tid) 的帮助下记录的thread__insert_map,并在稍后用于将示例事件地址转换为符号名称。

PS:您的 perf.data 大小为 300+ MB,这非常巨大并且处理速度可能很慢。-F freq对于长时间运行的程序,您可能希望使用perf record:perf record -F40或 with选项来降低性能记录事件采样频率-c

  • 是的,在 perf.data 文件中仅记录 mmap。但是没有显式 munmap 跟踪性能报告的事件可能会处理 mmap/munmap/mmap 序列,因为第二个 mmap 将被完全记录。 (2认同)