除了偏移之外,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
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
格式是否允许在其中存储符号信息?如果必须的话,我可以编写脚本来编写数据文件。