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

时间:2017-10-04 18:04:48

标签: c++ perf

除了偏移之外,perf是否能够生成包含符号信息的自包含perf.data文件?

默认情况下,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);
}

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

$ g++ -O0 hello.cpp
$ ./a.out
1783293664

如果我们想记录大部分时间花在哪里......我们可以使用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) ]

当我们运行perf report

时,我们在pager-ish程序中获得以下输出
 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

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

$ strings perf.data | grep add_to_store
Exit 1

如果我们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

有没有办法引导perf收集符号信息并将其放入perf.data?或者,如果失败,perf.data格式是否允许在其中存储符号信息?如果必须的话,我可以编写脚本来编写数据文件。

0 个答案:

没有答案