perf -- 除了偏移量之外,还将符号名称存储在 perf.data 中

Gre*_*bet 5 c++ perf

perf.dataperf 是否能够生成除偏移量之外还包含符号信息的独立文件?

默认情况下,perf report似乎根据文件可用来重建符号信息。

假设我们有一个hello.cpp文件/tmp/perftest

#include <cstdio>

int store = 0;

int add_to_store(int x) {
  store += x;
}

int main() {
  for (int i = 0; i < 1000000; ++i) {
    add_to_store(i);
  }
  printf("%d\n", store);
}
Run Code Online (Sandbox Code Playgroud)

如果你编译它(禁用优化)并运行它,你会得到一些数字

$ g++ -O0 hello.cpp
$ ./a.out
1783293664
Run Code Online (Sandbox Code Playgroud)

如果我们想记录它大部分时间都花在哪里......我们可以使用perf.

$ perf record ./a.out
1783293664
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.007 MB perf.data (15 samples) ]
Run Code Online (Sandbox Code Playgroud)

当我们运行时,我们在寻呼机式程序中得到以下输出perf report

 40.00%  a.out    a.out          [.] add_to_store
 40.00%  a.out    a.out          [.] main
 13.33%  a.out    ld-2.17.so     [.] do_lookup_x
  6.67%  a.out    ld-2.17.so     [.] calloc
Run Code Online (Sandbox Code Playgroud)

然而,符号数据实际上并不存在于 中perf.data,例如

$ strings perf.data | grep add_to_store
Exit 1
Run Code Online (Sandbox Code Playgroud)

如果我们rm ./a.out,那么我们会看到以下输出perf report

  20.00%  a.out    a.out             [.] 0x0000000000000608
  20.00%  a.out    a.out             [.] 0x000000000000062f
  13.33%  a.out    a.out             [.] 0x000000000000060e
  13.33%  a.out    a.out             [.] 0x0000000000000626
  13.33%  a.out    ld-2.17.so        [.] do_lookup_x
   6.67%  a.out    a.out             [.] 0x0000000000000603
   6.67%  a.out    a.out             [.] 0x0000000000000636
   6.67%  a.out    ld-2.17.so        [.] calloc
Run Code Online (Sandbox Code Playgroud)

有没有办法直接perf收集符号信息并放入perf.data?或者,如果做不到这一点,该perf.data格式是否允许在其中存储符号信息?如果需要的话,我可以编写一个脚本来处理数据文件。