linux perf显示每个elf-section的事件

laawzig2  于 2023-05-28  发布在  Linux
关注(0)|答案(1)|浏览(155)

有没有办法让perf report(或任何其他perf分析工具)按elf-section显示偶数计数?
例如,标准perf record echo "hi"; perf report导致:

# Overhead  Command  Shared Object     Symbol                
# ........  .......  ................  ......................
#
    20.62%  echo     [unknown]         [k] 0xffffffffaafa7fbb
    20.59%  echo     [unknown]         [k] 0xffffffffaa88996a
    18.12%  echo     libc.so.6         [.] __GI___getrandom
    17.68%  echo     [unknown]         [k] 0xffffffffaa52af74
    16.52%  echo     [unknown]         [k] 0xffffffffaa8a5d57
     5.51%  echo     [unknown]         [k] 0xffffffffaafb6c1c
     0.83%  perf-ex  [unknown]         [k] 0xffffffffaafb10f0
     0.11%  perf-ex  [unknown]         [k] 0xffffffffaa249286
     0.02%  perf-ex  [unknown]         [k] 0xffffffffaa210b39
     0.00%  perf-ex  [unknown]         [k] 0xffffffffaa296106
     0.00%  perf-ex  [unknown]         [k] 0xffffffffaa296104

而不是Symbol是函数(或地址,如果符号解析失败),有没有办法让它成为elf部分(所以可能是.text.text.<arbitrary-other-section>

编辑:动机是在使用-ffunction-sections编译时获得可靠的符号信息。

fdbelqdn

fdbelqdn1#

有没有办法只让它成为精灵部分(所以可能是.text或...
我怀疑是否存在这样的选项--这似乎是一个非常奇怪的需求(http://xyproblem.info可能适用于这里)。
perf是一个开源程序;你可以建立一个新的副本,它将地址解析为部分名称而不是符号名称。
一个更简单的解决方案可能是使用perf script -D,它产生的输出类似于:

655100227667001 0x4d0 [0x68]: PERF_RECORD_MMAP2 991807/991807: [0x557bfc80c000(0x1000) @ 0x1000 fe:00 22546274 180651332]: r-xp /tmp/a.out
...
655100231257619 0x918 [0x28]: PERF_RECORD_SAMPLE(IP, 0x4002): 991807/991807: 0x557bfc80c38d period: 1965769 addr: 0
...
           a.out 991807 655100.228914:    2945520 cycles:      557bfc80c38d MyClass::~MyClass+0x19 (/tmp/a.out)
...
           a.out 991807 655100.238353:    1115949 cycles:      557bfc80c38d MyClass::~MyClass+0x19 (/tmp/a.out)
...

您可以使用PERF_RECORD_MMAP2来找出内存中感兴趣的部分的位置,然后将来自PERF_RECORD_SAMPLE记录的地址转换为部分名称(并丢弃符号名称)。
找到了一个更简单的解决办法。
假设您有a.out,这是一个未剥离的二进制文件。perf record ./a.out; perf report生成“正常”报告:

99.88%  a.out    a.out                 [.] MyClass::~MyClass
   0.03%  a.out    ld-linux-x86-64.so.2  [.] _dl_relocate_object
   0.02%  a.out    [unknown]             [k] 0xffffffffb005b01b
...

让我们运行几个命令:

mv a.out a.out.orig
strip a.out.orig -o a.out.stripped
cp a.out.stripped a.out
perf report

现在报告看起来像这样:

60.44%  a.out    a.out                 [.] 0x000000000000138d
  21.88%  a.out    a.out                 [.] 0x0000000000001389
  17.56%  a.out    a.out                 [.] 0x0000000000001391
   0.03%  a.out    ld-linux-x86-64.so.2  [.] _dl_relocate_object
...

不是你想要的。但是让我们在.text的开头添加一个符号:

objcopy a.out.stripped  a.out  --add-symbol .text=.text:0x0,function,global

现在运行perf report会产生:

99.88%  a.out    a.out                 [.] .text
   0.03%  a.out    ld-linux-x86-64.so.2  [.] _dl_relocate_object

这正是你想要的(你可以为其他感兴趣的部分添加更多的符号)。

相关问题