如何在程序中找到符号来查找符号

时间:2012-06-07 14:02:04

标签: linux performance perf

使用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工具显示相应的符号,Zoom也是如此,我认为它使用的是perf

请注意,这是在x86-64上,因此二进制文件是使用-fomit-frame-pointer编译的,但在其他工具下运行也是如此。

8 个答案:

答案 0 :(得分:17)

这篇帖子已经超过一年了,但是当我遇到同样的问题时,它出现在我的谷歌搜索结果的顶部,我想我会在这里回答它。经过一番搜索后,我发现answer given in this related StackOverflow question非常有帮助。在我的Ubuntu Raring系统上,我最终执行了以下操作:

  1. 使用-g编译我的C ++源代码(非常明显,您需要调试符号)
  2. perf作为

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

    这种方式perf能够处理DWARF 2调试格式,这是Linux上使用的标准格式gcc-F 97参数将采样率降低到97 Hz。对我的系统来说,默认采样率显然过大,导致出现如下消息:

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

    之后的perf report调用会因分段错误而失败。随着采样率的降低,一切都很顺利。

  3. 在上一步中生成perf.data文件后没有任何错误,您可以运行perf report等。我个人喜欢FlameGraph工具来生成SVG可视化。
  4. Other people报告说正在运行

    echo 0 > /proc/sys/kernel/kptr_restrict
    
    如果需要内核符号,

    root也可以提供帮助。

答案 1 :(得分:3)

在我的情况下,解决方案是删除包含先前构建中的缓存符号的elf文件,并且搞砸了。

它们位于〜/ .debug /文件夹

答案 2 :(得分:1)

你的开发主机怎么样?它是否也在运行x86_64操作系统? 如果没有,请确保perf是交叉编译的,因为perf取决于工具链中的objdump和其他工具。

答案 3 :(得分:1)

确保使用-g选项和gcc(cc)编译程序,以便以操作系统的本机格式生成调试信息。 尝试执行以下操作并检查符号表中是否存在调试符号。

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

答案 4 :(得分:0)

您可以随时使用'$ nm'命令。

这是一些示例输出:

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

答案 5 :(得分:0)

通过prctl(PR_SET_NAME)

覆盖我的程序名称后,我遇到了与 perf 相同的问题

我可以看到你的情况非常相似:

  

70.06% ints.rkt [未知]

您执行的命令( racket )与 perf 所见的命令不同。

答案 6 :(得分:0)

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

的想要结果

答案 7 :(得分:0)

我也有这个问题,我看不到任何用户空间符号,但我看到了一些内核符号。我认为这是一个符号加载问题。在尝试了我能找到的所有可能的解决方案之后,我仍然无法使其发挥作用。

然后我依旧记得那个

  

ulimit -u unlimited

是必需的。我试过,它神奇地工作。

我从这个wiki中发现,当你使用太多文件描述符时需要这个命令。

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

我的最后一个命令是

  

perf记录-F 999 -g。/ my_program

不需要--call-graph