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

Sam*_*adt 25 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  
Run Code Online (Sandbox Code Playgroud)

这是相当缺乏信息的.

相关程序使用调试符号构建,sysprof工具显示相应的符号,Zoom也是如此,我认为它是perf在引擎盖下使用的.

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

min*_*iot 17

这篇文章已经有一年多的历史了,但是当我遇到同样的问题时它出现在我的谷歌搜索结果的顶部,我想我会在这里回答它.经过一番搜索后,我发现在这个相关的StackOverflow问题中给出答案非常有用.在我的Ubuntu Raring系统上,我最后做了以下事情:

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

    record -g dwarf -F 97 /path/to/my/program
    
    Run Code Online (Sandbox Code Playgroud)

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

    Warning:
    Processed 172390 events and lost 126 chunks!
    
    Check IO/CPU overload!
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    echo 0 > /proc/sys/kernel/kptr_restrict
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 它应该是“-g --call-graph dwarf”,因为-g启用调用图堆栈记录,但只是一个布尔标志,实际类型需要使用“--call-graph”机制设置。(并且使用“--call-graph”意味着“-g”仅使用“--call-graph dwarf”就足够了) (2认同)

小智 6

就我而言,解决方案是删除 elf 文件,这些文件包含以前版本中的缓存符号,并且将事情弄乱了。

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


小智 0

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