简体   繁体   English

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

[英]Linux perf not resolving some symbols with high addresses starting with 0xffffffff

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 is a symbol in main.cpp, so symbols in my source file have been resolved. func是 main.cpp 中的一个符号,因此我的源文件中的符号已被解析。 I call std::max and memset , they have beed resolved, too.我调用std::maxmemset ,它们也已解决。 But what about 0xffffffffb1077f22 , it is an address.但是0xffffffffb1077f22呢,它是一个地址。 And with nm main , I'm sure that it is not a symbol in main source file.并且使用nm main ,我确定它不是主源文件中的符号。 What is it?它是什么? I don't think it is a library function because memset and std::max can be resolved.我不认为这是一个库 function 因为memsetstd::max可以解决。

I run perf in ubuntu virtual machine of macos.我在macos的ubuntu虚拟机中运行perf。

I did not give attention to the warning message of perf report .我没有注意perf report的警告信息。 It says:它说:

WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,
check /proc/sys/kernel/kptr_restrict and /proc/sys/kernel/perf_event_paranoid.

So it seemed that I should set a proper value in /proc/sys/kernel/kptr_restrict.所以看来我应该在/proc/sys/kernel/kptr_restrict 中设置一个合适的值。

sudo echo 0 > /proc/sys/kernel/kptr_restrict

Then the address can be resolved.然后地址就可以解决了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM