g++ -std=c++17 -fno-omit-frame-pointer -O0 -g3 -o main main.cpp
perf stat ./main 5
perf report
20.98% main [unknown] [k] 0xffffffffb1077f22 ◆
19.11% main main [.] func ▒
17.96% main libc-2.31.so [.] __memset_avx2_erms ▒
13.07% main [unknown] [k] 0xffffffffb067a936 ▒
5.75% main [unknown] [k] 0xffffffffb10e68e5 ▒
3.30% main main [.] std::min<int> ▒
1.72% main [unknown] [k] 0xffffffffb1077f25 ▒
1.58% main [unknown] [k] 0xffffffffb086f485 ▒
1.01% main main [.] std::max<int>
func
是main.cpp中的符号,所以我的源文件中的符号已被解析。我打电话给std::max
和memset
,他们也已经解决了。但是0xffffffffb1077f22
呢,它是一个地址。对于 nm main
,我确信它不是主源文件中的符号。它是什么?我不认为它是库函数,因为memset
和std::max
可以解析。
我在macos的ubuntu虚拟机中运行perf。
我没有注意
perf report
的警告信息。
它说:
WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,
check /proc/sys/kernel/kptr_restrict and /proc/sys/kernel/perf_event_paranoid.
所以看来我应该在 /proc/sys/kernel/kptr_restrict 中设置一个合适的值。
echo 0 | sudo tee /proc/sys/kernel/kptr_restrict
然后地址就可以解析了。