33

使用时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,但在其他工具下运行时也是如此。

4

8 回答 8

32

这篇文章已经有一年多了,但是当我遇到同样的问题时它出现在我的谷歌搜索结果的顶部,我想我会在这里回答它。经过一番搜索,我发现这个相关的 StackOverflow 问题中给出的答案非常有帮助。在我的 Ubuntu Raring 系统上,我最终执行了以下操作:

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

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

    这种方式perf能够处理DWARF 2调试格式,这是gccLinux 上使用的标准格式。该-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. 其他人报告说跑步

    echo 0 > /proc/sys/kernel/kptr_restrict
    

    如果需要内核符号,root 也可以提供帮助。

于 2014-01-24T23:58:03.213 回答
4

在我的情况下,解决方案是删除包含以前版本中的缓存符号并且搞砸了的精灵文件。

它们位于 ~/.debug/ 文件夹中

于 2018-03-27T13:25:54.780 回答
1

您始终可以使用“$ 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
于 2013-07-20T21:33:26.000 回答
1

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

$objdump -t your-elf 
$readelf -a your-elf
$nm -a your-elf
于 2013-08-07T15:42:18.900 回答
1

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

然后我隐隐约约记得

ulimit -u 无限

是需要的。我试过了,它神奇地起作用了。

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

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

我最后的命令是

性能记录 -F 999 -g ./my_program

不需要 --call-graph

于 2017-05-05T04:17:39.890 回答
0

通过覆盖我的程序名称后,我遇到了与perf相同的问题prctl(PR_SET_NAME)

正如我所看到的,您的情况非常相似:

70.06% ints.rkt [未知]

您执行的命令(球拍)与perf看到的不同。

于 2013-09-06T12:34:47.200 回答
0

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

于 2012-08-10T02:38:26.173 回答
0

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

于 2013-10-29T14:44:47.770 回答