Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何让perf在程序中查找符号_Linux_Performance_Perf - Fatal编程技术网

Linux 如何让perf在程序中查找符号

Linux 如何让perf在程序中查找符号,linux,performance,perf,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] [.] 0x

使用
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也会显示相应的符号,我认为Zoom在引擎盖下使用了
perf


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

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

您始终可以使用“$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

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

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

在通过
prctl(PR\u SET\u name)

正如我所见,你的情况非常相似:

70.06%ints.rkt[未知]


您执行的命令(racket)与您看到的命令不同。

您可以通过
cat/proc/kallsyms
检查kptr\u restrict的值。如果结果中符号的地址都是0x000000,您可以通过命令
echo 0>sys/kernel/kptr\u restrict
来修复它。在这之后,你可能会得到
perf report

的想要的结果。这篇文章已经有一年多的历史了,但是当我遇到同样的问题时,它出现在我的谷歌搜索结果的顶部,我想我应该在这里回答它。经过更多的搜索,我发现这本书非常有用。在我的UbuntuRaring系统上,我完成了以下工作:

编译C++源代码,使用<代码> -g/> >(相当明显,需要调试符号)
  • 运行
    perf
    as

    record -g dwarf -F 97 /path/to/my/program
    
    这样
    perf
    就能够处理调试格式,这是
    gcc
    在Linux上使用的标准格式。
    -F 97
    参数将采样率降低到97 Hz。默认采样率对于我的系统来说显然太大,并导致如下消息:

    Warning:
    Processed 172390 events and lost 126 chunks!
    
    Check IO/CPU overload!
    
    之后的
    perf report
    调用将因分段错误而失败。随着采样率的降低,一切都很顺利

  • 一旦
    perf.data
    文件在上一步中生成且没有任何错误,您就可以运行
    perf report
    等。我个人喜欢生成SVG可视化的工具
  • 报道说

    echo 0 > /proc/sys/kernel/kptr_restrict
    
    如果需要内核符号,那么根也可以提供帮助


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

    然后我隐约记得

    ulimit-u无限

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

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

    我最后的命令是

    性能记录-F 999-g./my_程序


    不需要--call graph

    在我的例子中,解决方案是删除elf文件,这些文件包含以前构建中的缓存符号,并且把事情搞砸了


    它们位于~/.debug/folder

    中,并已使用
    -fno省略帧指针
    ,但没有效果。您能否创建一个显示问题的最小示例?从一个基本的二进制开始,它不会将差异一分为二。@BrianCain,相关的二进制相当大,因此一分为二并不真正可行。不过,我会在一个简单的程序上试用它,因为这可能也行不通,而且更容易跟踪;build=host=target。我认为您不需要显式的
    -gdwarf
    。它只在您使用
    -g
    构建时起作用,即默认情况下以标准格式查找调试信息,如果找到任何调试信息,请使用它。@PeterCordes谢谢。可能是因为它取决于提供它的版本和/或发行版。当我最初写这个答案时,我需要显式地提供参数,否则它不起作用。请告诉我是谁将符号保存到此文件夹~/.debug?perf record命令在那里创建了一个文件夹(如前所述)。但似乎很多程序都会写入此文件夹,因此您最好只删除与性能相关的人员。由于您通常以root用户身份运行perf记录,因此它将位于以下路径/root/.debug/home/username/application\u name中