我怎样才能得到PERF找到符号在我的计划(How can I get perf to find sy

2019-07-29 19:24发布

当使用perf report ,我没有看到任何符号我的程序,而不是我得到的输出是这样的:

$ perf record /path/to/racket ints.rkt 10000
$ perf report --stdio

# Overhead   Command      Shared Object  Symbol
# ........  ........  .................  ......
#
    70.06%  ints.rkt  [unknown]          [.] 0x5f99b8        
    26.28%  ints.rkt  [kernel.kallsyms]  [k] 0xffffffff8103d0ca
     3.66%  ints.rkt  perf-32046.map     [.] 0x7f1d9be46650  

这是相当不提供信息。

相关的程序是建立与调试符号,和sysprof工具显示适当的符号一样,缩放,我认为这是使用perf引擎盖下。

请注意,这是X86-64,所以二进制编译-fomit-frame-pointer ,但在其他工具运行,以及时是这种情况。

Answer 1:

这篇文章已经一岁多,但由于它在当我有同样的问题,我的谷歌搜索结果中的排名榜首,我想我会在这里回答。 经过一番搜索更多的时候,我发现在这个相关的StackOverflow问题给出的答案非常有帮助。 在我的Ubuntu系统铆足了劲,然后我最终做了以下内容:

  1. 编译我的C ++与源-g (很明显,你需要调试符号)
  2. 运行perf

     record -g dwarf -F 97 /path/to/my/program 

    这样perf是能够处理DWARF 2调试格式,这是标准格式gcc使用Linux操作系统。 所述-F 97参数降低了采样速率至97赫兹。 默认采样率显然我的系统过大,导致了这样的消息:

     Warning: Processed 172390 events and lost 126 chunks! Check IO/CPU overload! 

    perf report通话之后将失败,并分段错误。 随着降低采样率都制定了罚款。

  3. 一旦perf.data文件已经没有上一步骤中的任何错误产生,你可以运行perf report等。我个人很喜欢FlameGraph工具生成SVG可视化。
  4. 其他人报告说,跑步

     echo 0 > /proc/sys/kernel/kptr_restrict 

    作为root可以很好的帮助,如果内核符号是必需的。



Answer 2:

在我的情况下,解决办法是删除含有缓存符号从以前的版本并搞乱的东西了ELF文件。

他们是在〜/的.debug /文件夹



Answer 3:

如何您的开发主机? 难道它也运行x86_64的操作系统吗? 如果没有,请确保PERF是交叉编译,因为PERF依赖于工具链是objdump和其他工具。



Answer 4:

请确保您编译使用与海湾合作委员会(CC)沿着-g选项的程序,以便调试信息在操作系统的本机格式生成。 尽量做到以下几点,并检查是否有存在于符号表调试符号。

$objdump -t your-elf 
$readelf -a your-elf
$nm -a your-elf


Answer 5:

您可以随时使用“$纳米”命令。

这里是一些样本输出:

Ethans-MacBook-Pro:~ phyrrus9$ nm a.out
0000000100000000 T __mh_execute_header
0000000100000f30 T _main
                 U _printf
0000000100000f00 T _sigint
                 U _signal
                 U dyld_stub_binder


Answer 6:

我买了PERF同样的问题,压倒一切通过我的程序的名称后prctl(PR_SET_NAME)

我可以看到你的情况是很相似:

70.06%ints.rkt [未知]

你的命令已经执行( 球拍 )不同于一个PERF都看到了。



Answer 7:

您可以检查由kptr_restrict的值cat /proc/kallsyms 。 如果结果的符号的地址都是0x000000处,您可以通过命令修复它echo 0 > sys/kernel/kptr_restrict 。 在此之后,您可能会收到的通缉的结果perf report



Answer 8:

我有这个问题太,我看不到任何用户空间的象征,但我看到一些内核符号。 我认为这是一个符号加载问题。 尝试了所有可能的解决方案,我可以找到后,我仍然无法得到它的工作。

然后,我依稀记得

的ulimit -u无限

是必要的。 我试着和它神奇的工作。

我从这个wiki,当你使用太多的文件描述符需要此命令找到。

https://perf.wiki.kernel.org/index.php/Tutorial#Troubleshooting_and_Tips

我的最后一个命令是

PERF记录-F 999 -g ./my_program

并不需要--call-图



文章来源: How can I get perf to find symbols in my program