Linux perf 无法解析某些以 0xffffffff 开头的高地址符号

问题描述 投票:0回答:1
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。

c++ perf
1个回答
3
投票

我没有注意

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

然后地址就可以解析了。

© www.soinside.com 2019 - 2024. All rights reserved.